home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / toda / trans / src / tr_sub.c < prev    next >
C/C++ Source or Header  |  1993-07-08  |  71KB  |  2,712 lines

  1. /*
  2.             Trans Command    1990 6/8
  3.                     1993 3/6 修正
  4.  
  5. */
  6.  
  7. #include <stdlib.h>
  8. #include <math.h>
  9. #include <egb.h>
  10. #include <mos.h>
  11.  
  12. #include "egb17int.h"
  13.  
  14. extern error_check( int n );
  15. extern square_check( int a[][2] );
  16. extern backupput();
  17. extern mouse( int para[], int xd, int yd, int mode );
  18. extern mousesub2( int x, int y );
  19. extern spuit( int col[] );
  20. extern mask_on(int mode);
  21. extern mask_rev(int mode);
  22. extern command_start();
  23. extern command_end(char *buffer);
  24. extern lens_set( int mul );
  25. extern lens_rest( int mul );
  26. extern polygon1( int para[], char *buffer );
  27. extern polygon2( char *buffer );
  28. extern box( int para[], char *buffer );
  29. extern gprint( char *dsp, int x, int y );
  30. extern gprint2( char *dsp, int x, int y );
  31. extern itochar( int number, int x, char *dsp );
  32. extern windget();
  33. extern windput();
  34. extern vpoly1();
  35. extern vsync_wait( int ) ;
  36.  
  37. #define C_COLOR 0x7fff
  38. #define OFF_COLOR 0x4a52    /* g18 r18 b18 */
  39.  
  40. paint(col,pvar,ework,gwork,bbuf,mbuf)
  41. int col[],pvar[];
  42. char *ework,*gwork,*bbuf,*mbuf;
  43. {
  44.     int color,min,max,i,j,wt,jiscode,maskmode,sw,cx,cy;
  45.     int data[13];
  46.     char dsp1[] = "<<PAINT>> B   R   G   spuit   MASK(          ) MIX    LENS  EXIT";
  47.     char dsp2[] = "LINE(size  mix    mode ) POLY □ ○   (jis     dot  ) GRAD PAINT";
  48.     char dsp[13];            /* for jis code display */
  49.     int mp[4];            /* mouse para */
  50.  
  51.     command_start();            /* 全画面保存 & data clear */
  52.     maskmode = 0;
  53. paint1:    windget();
  54.     gprint( dsp1, 0, 463 );
  55.     gprint( dsp2, 0, 479 );
  56.     for( i = 0 ; i < 13 ; i++ )data[i] = -1;
  57.     paint_dsp(data,pvar,col,ework);
  58. paintA:    color = col[1] +(col[2]<<5) +(col[3]<<10);    /* palette */
  59.     EGB_color( ework,0, color );
  60.     gprint( "■", 216, 463 );
  61.     EGB_color( ework, 0, OFF_COLOR );        /* mask mode display */
  62.     gprint( "on rev off", 280, 463 );
  63.     EGB_color( ework, 0, C_COLOR );
  64.     switch( maskmode ){
  65.         case 0: gprint( "off", 280+56, 463 );
  66.             break;
  67.         case 1: gprint( "on", 280, 463 );
  68.             break;
  69.         case 2: gprint( "rev", 280+24, 463 );
  70.             break;
  71.     }
  72.     jiscode = pvar[8]*0x1000 + pvar[9]*0x0100 + pvar[10]*0x0010 + pvar[11];
  73.     gprint2( "  ", 288, 479 );                /* jis code */
  74.     WORD( dsp + 0 ) = 288;
  75.     WORD( dsp + 2 ) = 479;
  76.     WORD( dsp + 4 ) = 1;
  77.     DWORD( dsp + 6 ) = jiscode;
  78.     EGB_jisString( ework, dsp );
  79. paint2:    MOS_disp(1);
  80.     mouse( mp, 0, 0, 1);
  81.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  82.     if( cy < 447 )goto paint2;
  83.     if( cy < 463 ){
  84.         if( cx < 72 )goto paint2;
  85.         if( cx < 108 ){            /* B */
  86.             i = 0; min = 0; max = 31;
  87.             goto paint7;
  88.         }
  89.         if( cx < 140 ){            /* R */
  90.             i = 1; min = 0; max = 31;
  91.             goto paint7;
  92.         }
  93.         if( cx < 172 ){            /* G */
  94.             i = 2; min = 0; max = 31;
  95.             goto paint7;
  96.         }
  97.         if( cx < 240 ){            /* spuit 0 */
  98.             j = 0;
  99.             goto paint3;
  100.         }
  101.         if( cx < 300 ){            /* MASK 1 */
  102.             j = 1;
  103.             goto paint3;
  104.         }
  105.         if( cx < 332 ){            /* mask rev 2 */
  106.             j = 2;
  107.             goto paint3;
  108.         }
  109.         if( cx < 372 ){            /* mask off 3 */
  110.             j = 3;
  111.             goto paint3;
  112.         }
  113.         if( cx < 428 ){            /* mix */
  114.             i = 3;    min = 0; max = 256;
  115.             goto paint7;
  116.         }
  117.         if( cx < 472 ){            /* lens */
  118.             i = 4; min = 1; max = 8;
  119.             goto paint7;
  120.         }
  121.         if( cx < 512 ){            /* exit 4 */
  122.             j = 4;
  123.             goto paint3;
  124.         }
  125.         goto paint2;
  126.     }
  127.     if( cy < 480 ){
  128.         if( cx < 36 ){            /* line 5 */
  129.             j = 5;
  130.             goto paint3;
  131.         }
  132.         if( cx < 84 ){            /* line size */
  133.             i = 5; min = 1; max = 3;
  134.             goto paint7;
  135.         }
  136.         if( cx < 140 ){            /* line mix */
  137.             i = 6; min = 0; max = 257;
  138.             goto paint7;
  139.         }
  140.         if( cx < 196 ){            /* line mode */
  141.             i = 7; min = 0; max = 1;
  142.             goto paint7;
  143.         }
  144.         if( cx < 236 ){            /* polygon 6 */
  145.             j = 6;
  146.             goto paint3;
  147.         }
  148.         if( cx < 260 ){            /* rectangle 7 */
  149.             j = 7;
  150.             goto paint3;
  151.         }
  152.         if( cx < 284 ){            /* circle 8 */
  153.             j = 8;
  154.             goto paint3;
  155.         }
  156.         if( cx < 312 ){            /* put 9 */
  157.             j = 9;
  158.             goto paint3;
  159.         }
  160.         if( cx < 344 ){            /* put data */
  161.             i = 8; min = 0x2; max = 0x4;
  162.             goto paint7;
  163.         }
  164.         if( cx < 352 ){            /* put data */
  165.             i = 9; min = 0x0; max = 0xf;
  166.             goto paint7;
  167.         }
  168.         if( cx < 360 ){            /* put data */
  169.             i = 10; min = 0x0; max = 0xf;
  170.             goto paint7;
  171.         }
  172.         if( cx < 372 ){            /* put data */
  173.             i = 11; min = 0x0; max = 0xf;
  174.             goto paint7;
  175.         }
  176.         if( cx < 428 ){            /* put dot */
  177.             i = 12; min = 1; max = 32;
  178.             goto paint7;
  179.         }
  180.         if( cx < 468 ){            /* grad 10 */
  181.             j = 10;
  182.             goto paint3;
  183.         }
  184.         if( cx < 512 ){            /* PAINT 11 */
  185.             j = 11;
  186.             goto paint3;
  187.         }
  188.         goto paint2;
  189.     }
  190.     goto paint2;
  191.  
  192. paint3:    mouse( mp, 0, 0, 0);
  193.     if( sw > 1 )goto paint2;
  194.     MOS_disp(0);
  195.     windput();
  196.     switch( j ){
  197.         case 0: lens_set( pvar[4] );
  198.             spuit(col);        /* spuit */
  199.             lens_rest( pvar[4] );
  200.             break;
  201.         case 1: mask_on(1);        /* mask on */
  202.             maskmode = 1;
  203.             break;
  204.         case 2: mask_rev(1);        /* mask rev */
  205.             maskmode = 2;
  206.             break;
  207.         case 3: vpoly1();        /* v-ram clear (mask off) */
  208.             maskmode = 0;
  209.             break;
  210.         case 4: command_end(bbuf);    /* exit */
  211.             return 0;
  212.         case 5: lens_set( pvar[4] );    /* line */
  213.             line( col, pvar[5], pvar[6], pvar[7], gwork );
  214.             lens_rest( pvar[4] );
  215.             break;
  216.         case 6: lens_set( pvar[4] );    /* polygon */
  217.             polygon_paint( col, pvar[3], gwork, bbuf );
  218.             lens_rest( pvar[4] );
  219.             break;
  220.         case 7: lens_set( pvar[4] );    /* rectangle */
  221.             rectangle( col, pvar[3], maskmode, ework, mbuf );
  222.             lens_rest( pvar[4] );
  223.             break;
  224.         case 8: lens_set( pvar[4] );    /* circle */
  225.             circle( col, pvar[3], maskmode, ework, mbuf );
  226.             lens_rest( pvar[4] );
  227.             break;
  228.         case 9: lens_set( pvar[4] );    /* put */
  229.             put_string( col, jiscode, pvar[12], pvar[3], maskmode, ework, mbuf );
  230.             lens_rest( pvar[4] );
  231.             break;
  232.         case 10: lens_set( pvar[4] );    /* grad */
  233.             gradation( pvar[3], gwork, ework );
  234.             lens_rest( pvar[4] );
  235.             break;
  236.         case 11: lens_set( pvar[4] );    /* PAINT */
  237.             paint2( col, pvar[3], maskmode, ework, mbuf );
  238.             lens_rest( pvar[4] );
  239.             break;
  240.     }
  241.     goto paint1;
  242.  
  243. paint7:    wt = 20;
  244.     pvar[0] = col[1];
  245.     pvar[1] = col[2];
  246.     pvar[2] = col[3];
  247. paint8:    if( sw == 1 )pvar[i] = pvar[i] + 1;
  248.     if( sw == 2 )pvar[i] = pvar[i] - 1;
  249.     if( pvar[i] < min )pvar[i] = max;
  250.     if( pvar[i] > max )pvar[i] = min;
  251.     col[1] = pvar[0];
  252.     col[2] = pvar[1];
  253.     col[3] = pvar[2];
  254.     paint_dsp(data,pvar,col,ework);
  255.     vsync_wait( wt );
  256.     wt = 2;
  257.     MOS_rdpos(&sw,&cx,&cy);
  258.     if( sw > 0 )goto paint8;
  259.     goto paintA;
  260. }
  261.  
  262. paint_dsp(data,pvar,col,ework)
  263. int data[],pvar[],col[];
  264. char *ework;
  265. {
  266.     int i, x, y;
  267.     int point[13][3] = {    {  88,463,2 },    /* color data */
  268.                 { 120,463,2 },
  269.                 { 152,463,2 },
  270.  
  271.                 { 400,463,3 },    /* mix */
  272.  
  273.                 { 464,463,1 },    /* lens */
  274.  
  275.                 {  72,479,1 },    /* line */
  276.                 { 112,479,3 },
  277.                 { 176,479,1 },
  278.  
  279.                 { 336,479,1 },    /* jis code */
  280.                 { 344,479,1 },    /* jis code */
  281.                 { 352,479,1 },    /* jis code */
  282.                 { 360,479,1 },    /* jis code */
  283.  
  284.                 { 400,479,2 }    /* dot */
  285.                  };
  286.     char dsp[10];
  287.  
  288.     pvar[0] = col[1];
  289.     pvar[1] = col[2];
  290.     pvar[2] = col[3];
  291.     col[0] = col[1] + (col[2] << 5) + (col[3] << 10);
  292.     EGB_color(ework,0,C_COLOR);
  293.     for( i = 0 ; i < 13 ; i++ ){
  294.         if( data[i] != pvar[i] ){
  295.             x = point[i][0]; y = point[i][1];
  296.             MOS_disp(0);
  297.             itochar( pvar[i], point[i][2], dsp );
  298.             if( i==6 && pvar[i]==257 )gprint2( "NOR", x, y );
  299.             else gprint2( dsp, x, y );
  300.             data[i] = pvar[i];
  301.         }
  302.     }
  303.     return 0;
  304. }
  305.  
  306. line( col, size, half, mode, gwork )
  307. int col[],size,half,mode;
  308. char *gwork;
  309. {
  310.     int i, sw, cx, cy, mp[4];
  311.     int para[16];
  312.     unsigned int add;
  313.  
  314. line1:    MOS_disp(1);
  315.     mouse( mp, 0, 0, 1);
  316.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  317.     MOS_disp(0);
  318.     if( sw > 1 ){
  319.         mouse( mp, 0, 0, 0 );
  320.         if( spuit(col) )return 0;
  321.         goto line1;
  322.     }
  323.     para[0] = cx;
  324.     para[1] = cy;
  325.     para[2] = cx;
  326.     para[3] = cy;
  327.     para[4] = col[0];
  328.     para[5] = size;
  329.     para[6] = half;
  330.     para[7] = 0x10c;
  331.     line17( gwork, para );
  332. line2:    add = (unsigned int)( (cx << 1) + (cy << 10) );
  333.     if( add > 524286 )add = 524286;
  334.     xorw( add, 0x10c, 0x7fff );
  335.     do{
  336.         if( mode == 0 ){
  337.             MOS_rdpos(&sw,&cx,&cy);
  338.             mousesub2( cx, cy );
  339.             if( sw != 1 ){
  340.                 xorw( add, 0x10c, 0x7fff );
  341.                 goto line1;
  342.             }
  343.         }
  344.         if( mode != 0 ){
  345.             mouse( mp, 0, 0, 3 );
  346.             sw = mp[0]; cx = mp[1]; cy = mp[2];
  347.             if( sw != 1 ){
  348.                 xorw( add, 0x10c, 0x7fff );
  349.                 mouse( mp, 0, 0, 0 );
  350.                 goto line1;
  351.             }
  352.         }
  353.     }while( (para[0] == cx) && (para[1] == cy) );
  354.     xorw( add, 0x10c, 0x7fff );
  355.     para[2] = cx;
  356.     para[3] = cy;
  357.     line17( gwork, para );
  358.     for( i=0 ; i<300 ; i++ );        /* wait */
  359.     para[0] = para[2];
  360.     para[1] = para[3];
  361.     goto line2;
  362. }
  363.  
  364. paint2( col, mix, maskmode, ework, mbuf )
  365. int col[],mix,maskmode;
  366. char *ework,*mbuf;
  367. {
  368.     int sw, cx, cy, mp[4];
  369.     short int para[8];
  370.  
  371.     EGB_maskRegion(ework,mbuf);        /* mask buffer set */
  372. paint1:    EGB_mask(ework,0);
  373.     MOS_disp(1);
  374.     mouse( mp, 0, 0, 0 );
  375.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  376.     MOS_disp(0);
  377.     if( sw > 1 ){
  378.         EGB_mask(ework,0);            /* mask rest */
  379.         if( spuit(col) )return 0;
  380.         goto paint1;
  381.     }
  382.     para[0] = cx; para[1] = cy;
  383.     if( maskmode == 1 )EGB_mask(ework,0x80);
  384.     if( maskmode == 2 )EGB_mask(ework,0x81);
  385.     EGB_paintMode(ework,0x22);        /* べた塗り */
  386.     EGB_writeMode(ework,7);            /* pastel */
  387.     EGB_pastel(ework,mix);            /* mix rate */
  388.     EGB_color(ework,0,col[0]);        /* color */
  389.     EGB_color(ework,2,col[0]);        /* color */
  390.     EGB_closePaint( ework, (char *)para );
  391.     goto paint1;
  392. }
  393.  
  394. polygon_paint( col, mix, gwork, bbuf )
  395. int col[], mix;
  396. char *gwork, *bbuf;
  397. {
  398.     int mp[4], pp[6];
  399.     int para[16];
  400.  
  401. poly1:    if( polygon1( pp, bbuf ) ){
  402.         mouse( mp, 0, 0, 0);
  403.         if( spuit(col) )return 0;
  404.         goto poly1;
  405.     }
  406.     polygon2(bbuf);
  407.     para[0] = ( unsigned int )bbuf;
  408.     para[1] = 0x10c;
  409.     para[2] = pp[1];
  410.     para[3] = pp[2];
  411.     para[4] = pp[3];
  412.     para[5] = pp[4];
  413.     para[6] = col[0];
  414.     para[7] = mix;
  415.     polypaint( gwork, para );
  416.     goto poly1;
  417. }
  418.  
  419. rectangle( col, mix, maskmode, ework, mbuf )
  420. int col[],mix,maskmode;
  421. char *ework,*mbuf;
  422. {
  423.     int sw, cx, cy, mp[4];
  424.     short int para[8];
  425.  
  426.     EGB_maskRegion(ework,mbuf);        /* mask buffer set */
  427. rect1:    EGB_mask(ework,0);
  428.     MOS_disp(1);
  429.     mouse( mp, 0, 0, 0 );
  430.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  431.     MOS_disp(0);
  432.     if( sw > 1 ){
  433.         EGB_mask(ework,0);            /* mask rest */
  434.         if( spuit(col) )return 0;
  435.         goto rect1;
  436.     }
  437.     para[0] = cx; para[1] = cy;
  438.     mouse( mp, 0, 0, 4 );
  439.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  440.     if( sw > 1 )goto rect1;
  441.     para[2] = cx; para[3] = cy;
  442.     if( maskmode == 1 )EGB_mask(ework,0x80);
  443.     if( maskmode == 2 )EGB_mask(ework,0x81);
  444.     EGB_paintMode(ework,0x22);        /* べた塗り */
  445.     EGB_writeMode(ework,7);            /* pastel */
  446.     EGB_pastel(ework,mix);            /* mix rate */
  447.     EGB_color(ework,0,col[0]);        /* color */
  448.     EGB_color(ework,2,col[0]);        /* color */
  449.     EGB_rectangle( ework, (char *)para );
  450.     goto rect1;
  451. }
  452.  
  453. circle( col, mix, maskmode, ework, mbuf )
  454. int col[],mix,maskmode;
  455. char *ework,*mbuf;
  456. {
  457.     int sw, cx, cy, mp[4];
  458.     short int para[8];
  459.  
  460.     EGB_maskRegion(ework,mbuf);        /* mask buffer set */
  461. circ1:    EGB_mask(ework,0);
  462.     MOS_disp(1);
  463.     mouse( mp, 0, 0, 0 );
  464.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  465.     MOS_disp(0);
  466.     if( sw > 1 ){
  467.         EGB_mask(ework,0);            /* mask rest */
  468.         if( spuit(col) )return 0;
  469.         goto circ1;
  470.     }
  471.     para[0] = cx; para[1] = cy;
  472.     mouse( mp, 0, 0, 12 );
  473.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  474.     if( sw > 1 )goto circ1;
  475.     para[2] = cx-para[0]; para[3] = cy-para[1];
  476.     if( para[2] < 0 )para[2] = -para[2];
  477.     if( para[3] < 0 )para[3] = -para[3];
  478.     if( maskmode == 1 )EGB_mask(ework,0x80);
  479.     if( maskmode == 2 )EGB_mask(ework,0x81);
  480.     EGB_paintMode(ework,0x22);        /* べた塗り */
  481.     EGB_writeMode(ework,7);            /* pastel */
  482.     EGB_pastel(ework,mix);            /* mix rate */
  483.     EGB_color(ework,0,col[0]);        /* color */
  484.     EGB_color(ework,2,col[0]);        /* color */
  485.     EGB_ellipse( ework, (char *)para );
  486.     goto circ1;
  487. }
  488.  
  489. put_string( col, string, dot, mix, maskmode, ework, mbuf )
  490. int col[], string, dot, mix, maskmode;
  491. char *ework, *mbuf;
  492. {
  493.     int x0=-1, y0=-1, sw, cx, cy, mp[4];
  494.     char dsp[12];
  495.     unsigned int add;
  496.  
  497.     EGB_maskRegion(ework,mbuf);        /* mask buffer set */
  498.     EGB_mask(ework,0);            /* mask rest */
  499.     EGB_textZoom( ework, 1, dot, dot );    /* 拡大率 */
  500.     WORD(dsp+4) = 1;        /* 1文字 */
  501.     DWORD(dsp+6) = string;        /* string set */
  502. put01:    MOS_disp(1);
  503.     mouse( mp, 0, 0, 1);
  504.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  505.     MOS_disp(0);
  506.     if( sw > 1){
  507.         mouse( mp, 0, 0, 0);
  508.         if( spuit(col) )return 0;
  509.     }
  510.     EGB_paintMode(ework,0x22);    /* べた塗り */
  511.     EGB_pastel(ework,mix);        /* mix rate */
  512.     EGB_writeMode(ework,7);        /* pastel */
  513.     EGB_color(ework,0,col[0]);    /* color */
  514.     EGB_color(ework,2,col[0]);    /* color */
  515.     if( maskmode == 1 )EGB_mask(ework,0x80);
  516.     if( maskmode == 2 )EGB_mask(ework,0x81);
  517. put02:    add = (unsigned int)( (cx << 1) + (cy << 10) );
  518.     if( add > 524286 )add = 524286;
  519.     xorw( add, 0x10c, 0x7fff );
  520.     do{
  521.         MOS_rdpos(&sw,&cx,&cy);
  522.         mousesub2( cx, cy );
  523.         if( sw != 1 ){
  524.             xorw( add, 0x10c, 0x7fff );
  525.             EGB_mask(ework,0);    /* mask rest */
  526.             goto put01;
  527.         }
  528.     }while( cx == x0 && cy == y0 );
  529.     xorw( add, 0x10c, 0x7fff );
  530.     if( dot > 1 )WORD(dsp+0) = cx - ( dot >> 1 ) + 1;    /* put */
  531.     else WORD(dsp+0) = cx;
  532.     WORD(dsp+2) = cy+( dot >> 1 );
  533.     EGB_jisString(ework,dsp);
  534.     x0 = cx; y0 = cy;
  535.     goto put02;
  536. }
  537.  
  538. gradation( mix, gwork, ework )
  539. int mix;
  540. char *gwork, *ework;
  541. {
  542.     int i, bn, xmin, ymin, xmax, ymax, det, axm, aym;
  543.     int bx0, by0, bx1, by1, bx2, by2, bx3, by3;
  544.     int sw, cx, cy;
  545.     int b[5][2], para[20], mp[4];
  546.  
  547.     EGB_color(ework,0,C_COLOR);
  548.     EGB_paintMode(ework,0x2);
  549.     EGB_writeMode(ework,4);
  550. grad01:    MOS_disp(1);
  551.     mouse( mp, 0, 0, 0);
  552.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  553.     MOS_disp(0);
  554.     if( sw > 1 )return 0;
  555.     bn = 0; b[0][0] = cx; b[0][1] = cy;
  556.     while( bn < 3 ){
  557.         mouse( mp, 0, 0, 2);
  558.         sw = mp[0]; cx = mp[1]; cy = mp[2];
  559.         if( sw > 1 ){
  560.             if( bn == 0 )goto grad01;
  561.             for( i=1 ; i<=bn ; i++ ){    /* やりなおし */
  562.                 line_set( b[i-1][0], b[i-1][1], b[i][0], b[i][1], ework );
  563.             }
  564.             goto grad01;
  565.         }
  566.         bn++; b[bn][0] = cx; b[bn][1] = cy;    /* 次のステップ */
  567.         line_set( b[bn-1][0], b[bn-1][1], b[bn][0], b[bn][1], ework );
  568.     }
  569.     bn = 4; b[4][0] = b[0][0]; b[4][1] = b[0][1];    /* 最後のライン */
  570.     line_set( b[3][0], b[3][1], b[4][0], b[4][1], ework );
  571.     for( i=1 ; i<=bn ; i++ ){            /* ライン消し */
  572.         line_set( b[i-1][0], b[i-1][1], b[i][0], b[i][1], ework );
  573.     }
  574.     if( error_check( square_check( b ) ) )goto grad01;
  575.     xmin = b[0][0]; xmax = b[0][0]; ymin = b[0][1]; ymax = b[0][1];
  576.     for( i=0 ; i<4 ; i++ ){                /* 最大,最小 */
  577.         if( xmin > b[i][0] )xmin = b[i][0];
  578.         if( xmax < b[i][0] )xmax = b[i][0];
  579.         if( ymin > b[i][1] )ymin = b[i][1];
  580.         if( ymax < b[i][1] )ymax = b[i][1];
  581.     }
  582.     bx0 = b[0][0]; by0 = b[0][1];            /* ベクトル */
  583.     bx1 = b[1][0] - bx0; by1 = b[1][1] - by0;
  584.     bx2 = b[2][0] - bx0; by2 = b[2][1] - by0;
  585.     bx3 = b[3][0] - bx0; by3 = b[3][1] - by0;
  586.     det = bx1*by3 - bx3*by1;            /* DET */
  587.     if( det == 0 )goto grad01;
  588.     para[2] = ( by3*65536 )/det; para[3] = -( bx3*65536 )/det;
  589.     para[4] = -( by1*65536 )/det; para[5] = ( bx1*65536 )/det;
  590.     axm = para[2]*bx2 + para[3]*by2;
  591.     aym = para[4]*bx2 + para[5]*by2;
  592.     if( axm*aym == 0 )goto grad01;
  593.     para[6] = ( (double)axm - 65536 )/( (double)aym )*65536;
  594.     para[7] = ( (double)aym - 65536 )/( (double)axm )*65536;
  595.     para[8] = bx0; para[9] = by0;
  596.     para[10] = xmin; para[11] = ymin; para[12] = xmax; para[13] = ymax;
  597.     para[14] = ( peekw( b[0][1]*1024+b[0][0]*2 ,0x10c ) & 0x7fff );
  598.     para[15] = ( peekw( b[1][1]*1024+b[1][0]*2 ,0x10c ) & 0x7fff );
  599.     para[16] = ( peekw( b[3][1]*1024+b[3][0]*2 ,0x10c ) & 0x7fff );
  600.     para[17] = ( peekw( b[2][1]*1024+b[2][0]*2 ,0x10c ) & 0x7fff );
  601.     para[18] = mix;
  602.     para[0] = 0;    /* dummy */
  603.     para[1] = 0x10c;    /* VRAM segment */
  604.     MOS_disp(0);
  605.     grad17( gwork, para );
  606.     goto grad01;
  607. }
  608.  
  609. color_change(col1,col2,cvar,ework,gwork,bbuf)
  610. int col1[], col2[], cvar[];
  611. char *ework, *gwork, *bbuf;
  612. {
  613.     int color1,color2,min,max,i,j,wt,maskmode,sw,cx,cy;
  614.     int data[10];
  615.     char dsp1[] = "<<COLOR-CHANGE>> EXG( , )  MASK(          )  CANCEL  LENS   EXIT";
  616.     char dsp2[] = "CNV(mode  B   R   G   spuit  →  spuit B   R   G  )  MONO  NEGA";
  617.     int mp[4];
  618.  
  619.     command_start();            /* 全画面保存 & data clear */
  620.     maskmode = 0;
  621. color1:    windget();
  622.     gprint( dsp1, 0, 463 );
  623.     gprint( dsp2, 0, 479 );
  624.     for( i = 0 ; i < 10 ; i++ )data[i] = -1;
  625.     color_dsp(cvar,data,col1,col2,ework);
  626. colorA:    color1 = col1[1] +(col1[2]<<5) +(col1[3]<<10);    /* palette */
  627.     EGB_color( ework,0, color1 );
  628.     gprint( "■", 216, 479 );
  629.     color2 = col2[1] +(col2[2]<<5) +(col2[3]<<10);    /* palette */
  630.     EGB_color( ework,0, color2 );
  631.     gprint( "■", 248, 479 );
  632.     EGB_color( ework, 0, OFF_COLOR );        /* mask mode display */
  633.     gprint( "on rev off", 256, 463 );
  634.     EGB_color( ework, 0, C_COLOR );
  635.     switch( maskmode ){
  636.         case 0: gprint( "off", 256+56, 463 );
  637.             break;
  638.         case 1: gprint( "on", 256, 463 );
  639.             break;
  640.         case 2: gprint( "rev", 256+24, 463 );
  641.             break;
  642.     }
  643. color2:    MOS_disp(1);
  644.     mouse( mp, 0, 0, 1);
  645.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  646.     if( cy < 447 )goto color2;
  647.     if( cy < 463 ){
  648.         if( cx < 132 )goto color2;    /* nothing */
  649.         if( cx < 164 ){            /* exg 10 */
  650.             j = 10;
  651.             goto color3;
  652.         }
  653.         if( cx < 180 ){            /* exg color 1 */
  654.             i = 8; min = 0; max = 2;
  655.             goto color7;
  656.         }
  657.         if( cx < 208 ){            /* exg color 2 */
  658.             i = 9; min = 0; max = 2;
  659.             goto color7;
  660.         }
  661.         if( cx < 276 ){            /* MASK on 0 */
  662.             j = 0;
  663.             goto color3;
  664.         }
  665.         if( cx < 308 ){            /* MASK rev 1 */
  666.             j = 1;
  667.             goto color3;
  668.         }
  669.         if( cx < 352 ){            /* mask off 2 */
  670.             j = 2;
  671.             goto color3;
  672.         }
  673.         if( cx < 416 ){            /* cancel 3 */
  674.             j = 3;
  675.             goto color3;
  676.         }
  677.         if( cx < 468 ){            /* lens */
  678.             i = 0; min = 1; max = 8;
  679.             goto color7;
  680.         }
  681.         if( cx < 512 ){            /* exit 4 */
  682.             j = 4;
  683.             goto color3;
  684.         }
  685.         goto color2;
  686.     }
  687.     if( cy < 480 ){
  688.         if( cx < 28 ){            /* cnv 5 */
  689.             j = 5;
  690.             goto color3;
  691.         }
  692.         if( cx < 76 ){            /* mode */
  693.             i = 1; min = 0; max = 3;
  694.             goto color7;
  695.         }
  696.         if( cx < 108 ){            /* B1 */
  697.             i = 2; min = 0; max = 31;
  698.             goto color7;
  699.         }
  700.         if( cx < 140 ){            /* R1 */
  701.             i = 3; min = 0; max = 31;
  702.             goto color7;
  703.         }
  704.         if( cx < 172 ){            /* G1 */
  705.             i = 4; min = 0; max = 31;
  706.             goto color7;
  707.         }
  708.         if( cx < 240 ){            /* spuit1 6 */
  709.             j = 6;
  710.             goto color3;
  711.         }
  712.         if( cx < 308 ){            /* spuit1 7 */
  713.             j = 7;
  714.             goto color3;
  715.         }
  716.         if( cx < 340 ){            /* B2 */
  717.             i = 5; min = 0; max = 31;
  718.             goto color7;
  719.         }
  720.         if( cx < 372 ){            /* R2 */
  721.             i = 6; min = 0; max = 31;
  722.             goto color7;
  723.         }
  724.         if( cx < 416 ){            /* G2 */
  725.             i = 7; min = 0; max = 31;
  726.             goto color7;
  727.         }
  728.         if( cx < 464 ){            /* mono 8 */
  729.             j = 8;
  730.             goto color3;
  731.         }
  732.         if( cx < 512 ){            /* nega 9 */
  733.             j = 9;
  734.             goto color3;
  735.         }
  736.         goto color2;
  737.     }
  738.     goto color2;
  739.  
  740. color3:    mouse( mp, 0, 0, 0);
  741.     if( sw > 1 )goto color2;
  742.     MOS_disp(0);
  743.     windput();
  744.     switch( j ){
  745.         case 0: mask_on(1);        /* mask on */
  746.             maskmode = 1;
  747.             break;
  748.         case 1: mask_rev(1);        /* mask rev */
  749.             maskmode = 2;
  750.             break;
  751.         case 2: vpoly1();        /* v-ram clear (mask off) */
  752.             maskmode = 0;
  753.             break;
  754.         case 3: backupput();        /* cancel */
  755.             if( maskmode == 1 )mask_on(0);
  756.             if( maskmode == 2 )mask_rev(0);
  757.             break;
  758.         case 4: command_end(bbuf);    /* exit */
  759.             return 0;
  760.         case 5: lens_set( cvar[0] );    /* cnv */
  761.             color_cnv( cvar[1], col1, col2, gwork, bbuf );
  762.             lens_rest( cvar[0] );
  763.             break;
  764.         case 6: lens_set( cvar[0] );
  765.             spuit(col1);        /* spuit1 */
  766.             lens_rest( cvar[0] );
  767.             break;
  768.         case 7: lens_set( cvar[0] );
  769.             spuit(col2);        /* spuit2 */
  770.             lens_rest( cvar[0] );
  771.             break;
  772.         case 8: lens_set( cvar[0] );    /* mono */
  773.             color_mono( gwork, bbuf );
  774.             lens_rest( cvar[0] );
  775.             break;
  776.         case 9: lens_set( cvar[0] );    /* nega */
  777.             color_nega( gwork, bbuf );
  778.             lens_rest( cvar[0] );
  779.             break;
  780.         case 10: lens_set( cvar[0] );    /* exg */
  781.             color_exg( cvar[8], cvar[9], gwork, bbuf );
  782.             lens_rest( cvar[0] );
  783.             break;
  784.     }
  785.     goto color1;
  786.  
  787. color7:    wt = 20;
  788.     cvar[2] = col1[1];
  789.     cvar[3] = col1[2];
  790.     cvar[4] = col1[3];
  791.     cvar[5] = col2[1];
  792.     cvar[6] = col2[2];
  793.     cvar[7] = col2[3];
  794. color8:    if( sw == 1 )cvar[i] = cvar[i] + 1;
  795.     if( sw == 2 )cvar[i] = cvar[i] - 1;
  796.     if( cvar[i] < min )cvar[i] = max;
  797.     if( cvar[i] > max )cvar[i] = min;
  798.     col1[1] = cvar[2];
  799.     col1[2] = cvar[3];
  800.     col1[3] = cvar[4];
  801.     col2[1] = cvar[5];
  802.     col2[2] = cvar[6];
  803.     col2[3] = cvar[7];
  804.     color_dsp(cvar,data,col1,col2,ework);
  805.     vsync_wait( wt );
  806.     wt = 2;
  807.     MOS_rdpos(&sw,&cx,&cy);
  808.     if( sw > 0 )goto color8;
  809.     goto colorA;
  810. }
  811.  
  812. color_dsp(cvar,data,col1,col2,ework)
  813. int cvar[], data[], col1[], col2[];
  814. char *ework;
  815. {
  816.     int i, x, y;
  817.     int point[][3] = {    { 456,463,1 },    /* lens */
  818.                 {  64,479,1 },    /* mode */
  819.  
  820.                 {  88,479,2 },    /* color data1 */
  821.                 { 120,479,2 },
  822.                 { 152,479,2 },
  823.  
  824.                 { 320,479,2 },    /* color data2 */
  825.                 { 352,479,2 },
  826.                 { 384,479,2 },
  827.  
  828.                 { 168,463,1 },    /* exg color */
  829.                 { 184,463,1 }
  830.                };
  831.     char dsp[10];
  832.  
  833.     cvar[2] = col1[1];
  834.     cvar[3] = col1[2];
  835.     cvar[4] = col1[3];
  836.     cvar[5] = col2[1];
  837.     cvar[6] = col2[2];
  838.     cvar[7] = col2[3];
  839.     col1[0] = col1[1] + (col1[2] << 5) + (col1[3] << 10);
  840.     col2[0] = col2[1] + (col2[2] << 5) + (col2[3] << 10);
  841.     EGB_color(ework,0,C_COLOR);
  842.     for( i = 0 ; i < 10 ; i++ ){
  843.         if( data[i] != cvar[i] ){
  844.             x = point[i][0]; y = point[i][1];
  845.             MOS_disp(0);
  846.             if( i < 8 )itochar( cvar[i], point[i][2], dsp );
  847.             if( i >= 8 ){
  848.                 dsp[1] = (char)0;
  849.                 if( cvar[i] == 0 )dsp[0] = 'B';
  850.                 if( cvar[i] == 1 )dsp[0] = 'R';
  851.                 if( cvar[i] == 2 )dsp[0] = 'G';
  852.             }
  853.             gprint2( dsp, x, y );
  854.             data[i] = cvar[i];
  855.         }
  856.     }
  857.     return 0;
  858. }
  859.  
  860. color_cnv( mode, col1, col2, gwork, bbuf )
  861. int mode, col1[], col2[];
  862. char *gwork, *bbuf;
  863. {
  864.     int i, j, n;
  865.     double as01, as02, as11, det;
  866.     double v0[4][4], v1[4][4], a[4][4], m[10];
  867.     int mp[4], pp[6], para[20];
  868.  
  869.     if( mode == 2 ){
  870.         for( i=0 ; i<=8 ; i++ )para[i+2] = 0;
  871.         para[2] = 65536; para[6] = 65536; para[10] = 65536;
  872.         for( i=0 ; i<=2 ; i++ )para[i+11] = (col2[i+1] - col1[i+1])*65536;
  873.         goto cnv03;
  874.     }
  875.  
  876.     if( mode == 3 ){
  877.         for( i=0 ; i<=8 ; i++ )para[i+2] = 0;
  878.         para[2] = 65536*col2[1];if( col1[1] )para[2] = para[2]/col1[1];
  879.         para[6] = 65536*col2[2];if( col1[2] )para[6] = para[6]/col1[2];
  880.         para[10]= 65536*col2[3];if( col1[3] )para[10]=para[10]/col1[3];
  881.         for( i=0 ; i<=2 ; i++ )para[i+11] = 0;
  882.         goto cnv03;
  883.     }
  884.  
  885.     as01 = sqrt( col1[1]*col1[1] + col1[2]*col1[2] + col1[3]*col1[3] );
  886.     as11 = sqrt( col2[1]*col2[1] + col2[2]*col2[2] + col2[3]*col2[3] );
  887.     for( i=1 ; i<=3 ; i++ ){
  888.         if( as01 > 0 ){
  889.             v0[i][1] = col1[i]/as01;
  890.         }
  891.         else v0[i][1] = 0;
  892.         if( as11 > 0 ){
  893.             v1[i][1] = col2[i]/as11;
  894.         }
  895.         else v1[i][1] = 0;
  896.     }
  897.     v0[1][2] = v0[2][1]*v1[3][1] - v0[3][1]*v1[2][1];
  898.     v0[2][2] = v0[3][1]*v1[1][1] - v0[1][1]*v1[3][1];
  899.     v0[3][2] = v0[1][1]*v1[2][1] - v0[2][1]*v1[1][1];
  900.     as02=sqrt( v0[1][2]*v0[1][2] + v0[2][2]*v0[2][2] + v0[3][2]*v0[3][2] );
  901.     if( as02 == 0 ){
  902.         for( i=0 ; i<=8 ; i++ )m[i] = 0;
  903.             m[0] = 1; m[4] = 1; m[8] = 1;
  904.             goto cnv02;
  905.     }
  906.     for( i=1 ; i<=3 ; i++ ){
  907.         v0[i][2] = v0[i][2]/as02;
  908.         v1[i][2] = v0[i][2];
  909.     }
  910.     v0[1][3] = v0[2][1]*v0[3][2] - v0[3][1]*v0[2][2];
  911.     v0[2][3] = v0[3][1]*v0[1][2] - v0[1][1]*v0[3][2];
  912.     v0[3][3] = v0[1][1]*v0[2][2] - v0[2][1]*v0[1][2];
  913.     v1[1][3] = v1[2][1]*v1[3][2] - v1[3][1]*v1[2][2];
  914.     v1[2][3] = v1[3][1]*v1[1][2] - v1[1][1]*v1[3][2];
  915.     v1[3][3] = v1[1][1]*v1[2][2] - v1[2][1]*v1[1][2];
  916.     det = v0[1][1]*v0[2][2]*v0[3][3] + v0[1][2]*v0[2][3]*v0[3][1] + v0[1][3]*v0[2][1]*v0[3][2] - v0[1][3]*v0[2][2]*v0[3][1] - v0[1][2]*v0[2][1]*v0[3][3] - v0[1][1]*v0[2][3]*v0[3][2];
  917.     a[1][1] = v0[2][2]*v0[3][3] - v0[2][3]*v0[3][2];
  918.     a[1][2] = v0[3][2]*v0[1][3] - v0[3][3]*v0[1][2];
  919.     a[1][3] = v0[1][2]*v0[2][3] - v0[1][3]*v0[2][2];
  920.     a[2][1] = v0[2][3]*v0[3][1] - v0[2][1]*v0[3][3];
  921.     a[2][2] = v0[3][3]*v0[1][1] - v0[3][1]*v0[1][3];
  922.     a[2][3] = v0[1][3]*v0[2][1] - v0[1][1]*v0[2][3];
  923.     a[3][1] = v0[2][1]*v0[3][2] - v0[2][2]*v0[3][1];
  924.     a[3][2] = v0[3][1]*v0[1][2] - v0[3][2]*v0[1][1];
  925.     a[3][3] = v0[1][1]*v0[2][2] - v0[1][2]*v0[2][1];
  926.     for( i=1 ; i<=3 ; i++ ){
  927.         for( j=1 ; j<=3 ; j++ )a[i][j] = a[i][j]/det;
  928.     }
  929.     n = 0;
  930.     for( i=1 ; i<=3 ; i++ ){
  931.         for( j=1 ; j<=3 ; j++ ){
  932.             m[n] = v1[i][1]*a[1][j] + v1[i][2]*a[2][j] + v1[i][3]*a[3][j];
  933.             n++;
  934.         }
  935.     }
  936. cnv02:    for( i=0 ; i<=8 ; i++ ){
  937.         if( (as01 > 0) && (mode==0) )m[i] = m[i] * as11 /as01;
  938.         para[i+2] = m[i]*65536;
  939.     }
  940.     for( i=0 ; i<=2 ; i++ ){
  941.         para[i+11] = 0;
  942.         if( (as11 > 0) && (mode!=0) )para[i+11] = col2[i+1]*( as11 - as01 )/as11*65536;
  943.     }
  944. cnv03:    MOS_disp(1);
  945.     if( polygon1( pp, bbuf ) ){
  946.         mouse( mp, 0, 0, 0);
  947.         return 0;
  948.     }
  949.     polygon2(bbuf);
  950.     para[0] = (unsigned int)bbuf; para[1] = 0x10c;
  951.     para[14]= pp[1]; para[15]= pp[2]; para[16]= pp[3]; para[17]= pp[4];
  952.     colmatrix( gwork, para );
  953.     goto cnv03;
  954. }
  955.  
  956. color_mono( gwork, bbuf )
  957. char *gwork, *bbuf;
  958. {
  959.     int i, mp[4], pp[6], para[20];
  960.  
  961.     for( i=0 ; i<=8 ; i++ )para[i+2] = 21845;
  962.     para[11] = 0; para[12] = 0; para[13] = 0;
  963. mono01:    MOS_disp(1);
  964.     if( polygon1( pp, bbuf ) ){
  965.         mouse( mp, 0, 0, 0 );
  966.         return 0;
  967.     }
  968.     polygon2(bbuf);
  969.     para[0] = (unsigned int)bbuf; para[1] = 0x10c;
  970.     para[14]= pp[1]; para[15]= pp[2]; para[16]= pp[3]; para[17]= pp[4];
  971.     colmatrix( gwork, para );
  972.     goto mono01;
  973. }
  974.  
  975. color_nega( gwork, bbuf )
  976. char *gwork, *bbuf;
  977. {
  978.     int i, mp[4], pp[6], para[20];
  979.  
  980.     for( i=0 ; i<=8 ; i++ )para[i+2] = 0;
  981.     para[2] = -65536; para[6] = -65536; para[10] = -65536;
  982.     para[11] = 2097150; para[12] = 2097150; para[13] = 2097150;
  983. nega01:    MOS_disp(1);
  984.     if( polygon1( pp, bbuf ) ){
  985.         mouse( mp, 0, 0, 0 );
  986.         return 0;
  987.     }
  988.     polygon2(bbuf);
  989.     para[0] = (unsigned int)bbuf; para[1] = 0x10c;
  990.     para[14]= pp[1]; para[15]= pp[2]; para[16]= pp[3]; para[17]= pp[4];
  991.     colmatrix( gwork, para );
  992.     goto nega01;
  993. }
  994.  
  995. color_exg( c1, c2, gwork, bbuf )
  996. int c1, c2;
  997. char *gwork, *bbuf;
  998. {
  999.     int i, mp[4], pp[6], para[20];
  1000.  
  1001.     for( i=0 ; i<=8 ; i++ )para[i+2] = 0;
  1002.     for( i=0 ; i<3 ; i++ ){
  1003.         if( i == c1 )para[i*3+c2+2] = 65536;
  1004.         if( i == c2 )para[i*3+c1+2] = 65536;
  1005.         if( (i != c1) && (i != c2) )para[i*3+i+2] = 65536;
  1006.     }
  1007.     para[11] = 0; para[12] = 0; para[13] = 0;
  1008. exg01:    MOS_disp(1);
  1009.     if( polygon1( pp, bbuf ) ){
  1010.         mouse( mp, 0, 0, 0 );
  1011.         return 0;
  1012.     }
  1013.     polygon2(bbuf);
  1014.     para[0] = (unsigned int)bbuf; para[1] = 0x10c;
  1015.     para[14]= pp[1]; para[15]= pp[2]; para[16]= pp[3]; para[17]= pp[4];
  1016.     colmatrix( gwork, para );
  1017.     goto exg01;
  1018. }
  1019.  
  1020. copy(mode,copyvar,ework,gwork,bbuf,pn,dispmode)
  1021. int copyvar[];
  1022. char *ework, *gwork, *bbuf;
  1023. int mode, *pn, *dispmode;
  1024. {
  1025.     int min,max,i,j,wt,maskmode,sw,cx,cy;
  1026.     int data[2];
  1027.     char dsp1[] = "                   MASK(          )  CANCEL  MIX     LENS   EXIT";
  1028.     char dsp2[] = "POLYGON/BOX(                                      )  QUAD-EXPAND";
  1029.     int mp[4], pp[6], para[20];
  1030.  
  1031.     /* pp[] = { pn, ax1, ay1, ax2, ay2 } */
  1032.  
  1033.     command_start();            /* 全画面保存 & data clear */
  1034.     maskmode = 0;
  1035. copy1:    windget();
  1036.     if( mode == 0 )gprint( "<<COPY>>",0,463 );
  1037.     else gprint( "<<TRANS>>",0,463 );
  1038.     gprint( dsp1, 0, 463 );
  1039.     gprint( dsp2, 0, 479 );
  1040.     for( i = 0 ; i < 2 ; i++ )data[i] = -1;
  1041.     copy_dsp(copyvar,data,ework);
  1042.     if( *pn )EGB_color( ework, 0, C_COLOR );
  1043.     else EGB_color( ework, 0, OFF_COLOR );
  1044.     gprint( "normal mirror reverse turn zoom expand", 96, 479 );
  1045.     EGB_color( ework, 0, OFF_COLOR );        /* mask mode display */
  1046.     gprint( "on rev off", 192, 463 );
  1047.     EGB_color( ework, 0, C_COLOR );
  1048.     switch( maskmode ){
  1049.         case 0: gprint( "off", 192+56, 463 );
  1050.             break;
  1051.         case 1: gprint( "on", 192, 463 );
  1052.             break;
  1053.         case 2: gprint( "rev", 192+24, 463 );
  1054.             break;
  1055.     }
  1056. copy2:    MOS_disp(1);
  1057.     mouse( mp, 0, 0, 1 );
  1058.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  1059.     if( cy < 447 )goto copy2;
  1060.     if( cy < 463 ){
  1061.         if( cx < 144 )goto copy2;
  1062.         if( cx < 212 ){            /* mask on 0 */
  1063.             j = 0;
  1064.             goto copy3;
  1065.         }
  1066.         if( cx < 244 ){            /* mask rev 1 */
  1067.             j = 1;
  1068.             goto copy3;
  1069.         }
  1070.         if( cx < 288 ){            /* mask off 2 */
  1071.             j = 2;
  1072.             goto copy3;
  1073.         }
  1074.         if( cx < 352 ){            /* cancel 3 */
  1075.             j = 3;
  1076.             goto copy3;
  1077.         }
  1078.         if( cx < 416 ){            /* mix */
  1079.             i = 0; min = 0; max = 256;
  1080.             goto copy7;
  1081.         }
  1082.         if( cx < 472 ){            /* lens */
  1083.             i = 1; min = 1; max = 8;
  1084.             goto copy7;
  1085.         }
  1086.         if( cx < 512 ){            /* exit 4 */
  1087.             j = 4;
  1088.             goto copy3;
  1089.         }
  1090.         goto copy2;
  1091.     }
  1092.     if( cy < 480 ){
  1093.         if( cx < 60 ){            /* polygon 5 */
  1094.             j = 5;
  1095.             goto copy3;
  1096.         }
  1097.         if( cx < 92 ){            /* box 6 */
  1098.             j = 6;
  1099.             goto copy3;
  1100.         }
  1101.         if( cx < 148 ){        /* copy 7 */
  1102.             j = 7;
  1103.             goto copy3;
  1104.         }
  1105.         if( cx < 204 ){        /* mirror 8 */
  1106.             j = 8;
  1107.             goto copy3;
  1108.         }
  1109.         if( cx < 268 ){        /* reverse 9 */
  1110.             j = 9;
  1111.             goto copy3;
  1112.         }
  1113.         if( cx < 308 ){        /* turn 10 */
  1114.             j = 10;
  1115.             goto copy3;
  1116.         }
  1117.         if( cx < 348 ){        /* zoom 11 */
  1118.             j = 11;
  1119.             goto copy3;
  1120.         }
  1121.         if( cx < 416 ){        /* expand 12 */
  1122.             j = 12;
  1123.             goto copy3;
  1124.         }
  1125.         if( cx < 512 ){        /* quad expand 13 */
  1126.             j = 13;
  1127.             goto copy3;
  1128.         }
  1129.         goto copy2;
  1130.     }
  1131.     goto copy2;
  1132.  
  1133. copy3:    mouse( mp, 0, 0, 0 );
  1134.     if( sw > 1 )goto copy2;
  1135.     MOS_disp(0);
  1136.     windput();
  1137.     switch( j ){
  1138.         case 0:    mask_on(1);        /* mask on */
  1139.             maskmode = 1;
  1140.             break;
  1141.         case 1:    mask_rev(1);        /* mask rev */
  1142.             maskmode = 2;
  1143.             break;
  1144.         case 2:    vpoly1();        /* mask off */
  1145.             maskmode = 0;
  1146.             break;
  1147.         case 3:    backupput();        /* cancel */
  1148.             polygon2(bbuf);
  1149.             vpoly1();
  1150.             if( maskmode == 1 )mask_on(0);
  1151.             if( maskmode == 2 )mask_rev(0);
  1152.             break;
  1153.         case 4: command_end(bbuf);    /* exit */
  1154.             return 0;
  1155.         case 5: lens_set( copyvar[1] );        /* polygon */
  1156.             polygon2(bbuf);            /* pline clear */
  1157.             para[0] = (unsigned int)bbuf;    /* 画面change */
  1158.             para[1] = 0x10c;
  1159.             para[2] = 11;    /* mode11:normal change 1990 12 */
  1160.             puta17( gwork, para );
  1161.             polygon1( pp, bbuf );        /* polygon */
  1162.             MOS_disp(0);
  1163.             if( pp[1] == pp[3] || pp[2] == pp[4] ){    /* 不正 */
  1164.                 polygon2(bbuf);
  1165.                 poly1(bbuf);
  1166.                 *pn = 0;
  1167.             }
  1168.             polygon2(bbuf);        /* new line clear */
  1169.             para[2] = 0;        /* change */
  1170.             puta17( gwork, para );
  1171.             polygon2(bbuf);        /* line set */
  1172.             if( maskmode == 1 )mask_on(0);
  1173.             if( maskmode == 2 )mask_rev(0);
  1174.             lens_rest( copyvar[1] );
  1175.             break;
  1176.         case 6:    lens_set( copyvar[1] );        /* box */
  1177.             polygon2(bbuf);            /* pline clear */
  1178.             para[0] = (unsigned int)bbuf;    /* 画面change */
  1179.             para[1] = 0x10c;
  1180.             para[2] = 11;    /* mode11:normal change 1990 12 */
  1181.             puta17( gwork, para );
  1182.             box( pp, bbuf );        /* box */
  1183.             MOS_disp(0);
  1184.             if( pp[1] == pp[3] || pp[2] == pp[4] ){    /* 不正 */
  1185.                 poly1(bbuf);
  1186.                 *pn = 0;
  1187.             }
  1188.             para[2] = 0;        /* change */
  1189.             puta17( gwork, para );
  1190.             polygon2(bbuf);        /* line set */
  1191.             if( maskmode == 1 )mask_on(0);
  1192.             if( maskmode == 2 )mask_rev(0);
  1193.             lens_rest( copyvar[1] );
  1194.             break;
  1195.         case 7: if( *pn == 0 )break;
  1196.             lens_set( copyvar[1] );    /* copy */
  1197.             trans_copy( 0, pp, copyvar[0], gwork, bbuf );
  1198.             lens_rest( copyvar[1] );
  1199.             break;
  1200.         case 8: if( *pn == 0 )break;
  1201.             lens_set( copyvar[1] );    /* mirror */
  1202.             trans_copy( 1, pp, copyvar[0], gwork, bbuf );
  1203.             lens_rest( copyvar[1] );
  1204.             break;
  1205.         case 9: if( *pn == 0 )break;
  1206.             lens_set( copyvar[1] );    /* reverse */
  1207.             trans_copy( 2, pp, copyvar[0], gwork, bbuf );
  1208.             lens_rest( copyvar[1] );
  1209.             break;
  1210.         case 10: if( *pn == 0 )break;    /* turn */
  1211.             lens_set( copyvar[1] );
  1212.             turn_copy( pp, copyvar[0], ework, gwork, bbuf, dispmode );
  1213.             lens_rest( copyvar[1] );
  1214.             break;
  1215.         case 11: if( *pn == 0 )break;    /* zoom */
  1216.             lens_set( copyvar[1] );
  1217.             zoom_copy( pp, copyvar[0], gwork, bbuf, ework );
  1218.             lens_rest( copyvar[1] );
  1219.             break;
  1220.         case 12: if( *pn == 0 )break;    /* expand */
  1221.             lens_set( copyvar[1] );
  1222.             expand_copy( pp, copyvar[0], gwork, bbuf, ework );
  1223.             lens_rest( copyvar[1] );
  1224.             break;
  1225.         case 13: lens_set( copyvar[1] );    /* quad expand */
  1226.             quad_copy( copyvar[0], maskmode, gwork, bbuf, ework );
  1227.             if( maskmode == 1 )mask_on(0);
  1228.             if( maskmode == 2 )mask_rev(0);
  1229.             lens_rest( copyvar[1] );
  1230.             break;
  1231.     }
  1232.     goto copy1;
  1233.  
  1234. copy7:    wt = 20;
  1235. copy8:    if( sw == 1 )copyvar[i] = copyvar[i] + 1;
  1236.     if( sw == 2 )copyvar[i] = copyvar[i] - 1;
  1237.     if( copyvar[i] < min )copyvar[i] = max;
  1238.     if( copyvar[i] > max )copyvar[i] = min;
  1239.     copy_dsp(copyvar,data,ework);
  1240.     vsync_wait( wt );
  1241.     wt = 2;
  1242.     MOS_rdpos(&sw,&cx,&cy);
  1243.     if( sw > 0 )goto copy8;
  1244.     goto copy2;
  1245. }
  1246.  
  1247. copy_dsp(copyvar,data,ework)
  1248. int copyvar[], data[];
  1249. char *ework;
  1250. {
  1251.     int i, x, y;
  1252.     int point[2][3] = {    { 384,463,3 },    /* mix */
  1253.                 { 456,463,1 }    /* lens */
  1254.                };
  1255.     char dsp[10];
  1256.  
  1257.     EGB_color(ework,0,C_COLOR);
  1258.     for( i = 0 ; i < 2 ; i++ ){
  1259.         if( data[i] != copyvar[i] ){
  1260.             x = point[i][0]; y = point[i][1];
  1261.             MOS_disp(0);
  1262.             itochar( copyvar[i], point[i][2], dsp );
  1263.             gprint2( dsp, x, y );
  1264.             data[i] = copyvar[i];
  1265.         }
  1266.     }
  1267.     return 0;
  1268. }
  1269.  
  1270. trans_copy( mode, pp, mix, gwork, bbuf )
  1271. int mode, pp[], mix;
  1272. char *gwork, *bbuf;
  1273. {
  1274.     int xds, yds, sw, cx, cy, mp[4], para[12];
  1275.  
  1276.     xds = pp[3] - pp[1]; yds = pp[4] - pp[2];
  1277.     para[0] = (unsigned int)bbuf;
  1278.     para[1] = 0x10c;
  1279.     if( mode == 0 ){
  1280.         para[2] = 1; para[3] = 1; para[4] = pp[1]; para[5] = pp[2];
  1281.     }
  1282.     if( mode == 1 ){
  1283.         para[2] =-1; para[3] = 1; para[4] = pp[3]; para[5] = pp[2];
  1284.     }
  1285.     if( mode == 2 ){
  1286.         para[2] = 1; para[3] =-1; para[4] = pp[1]; para[5] = pp[4];
  1287.     }
  1288. trans1:    mouse( mp, xds, yds, 7 );
  1289.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  1290.     if( sw > 1 )return 0;
  1291.     polygon2(bbuf);
  1292.     do{    para[6] = cx - ( xds >> 1 );
  1293.         para[7] = cy - ( yds >> 1 );
  1294.         para[8] = para[6] + xds;
  1295.         para[9] = para[7] + yds;
  1296.         para[10] = mix;
  1297.         copy17( gwork, para );
  1298.         MOS_rdpos( &sw, &cx, &cy );
  1299.         mousesub2( cx, cy );
  1300.     }while( sw == 1 );
  1301.     polygon2(bbuf);
  1302.     goto trans1;
  1303. }
  1304.  
  1305. turn_copy( pp, mix, ework, gwork, bbuf, dispmode )
  1306. int pp[], mix, *dispmode;
  1307. char *ework, *gwork, *bbuf;
  1308. {
  1309.     int ax1, ay1, ax2, ay2, sw, cx, cy, xmid, ymid;
  1310.     int bx1, by1, bx2, by2, xmax, ymax, xmin, ymin, a;
  1311.     double r, tsin1, tsin2, tcos;
  1312.     int mp[12], para[16];
  1313.     short int para2[5];
  1314.  
  1315.     ax1 = pp[1]; ay1 = pp[2]; ax2 = pp[3]; ay2 = pp[4];
  1316.     para[0] = (unsigned int)bbuf;
  1317.     para[1] = 0x10c;
  1318. turn1:    MOS_disp(1);
  1319.     mouse( mp, 0, 0, 0 );
  1320.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  1321.     MOS_disp(0);
  1322.     if( sw > 1 )return 0;
  1323.     bx1 = cx; by1 = cy;
  1324.     if( *dispmode == 0 ){            /* circle display */
  1325.         para2[0] = cx; para2[1] = cy;
  1326.         para2[2] = 60; para2[3] = 60;
  1327.         EGB_ellipse( ework, (char *)para2 );
  1328.         line_set( cx, cy, cx+60, cy, ework );
  1329.     }
  1330.     else {
  1331.         para2[0] = cx; para2[1] = cy;
  1332.         para2[2] = 50; para2[3] = 60;
  1333.         EGB_ellipse( ework, (char *)para2 );
  1334.         line_set( cx, cy, cx+50, cy, ework );
  1335.     }
  1336.     mouse( mp, 0, 0, 2 );
  1337.     if( *dispmode == 0 ){            /* circle delete */
  1338.         para2[0] = cx; para2[1] = cy;
  1339.         para2[2] = 60; para2[3] = 60;
  1340.         EGB_ellipse( ework, (char *)para2 );
  1341.         line_set( cx, cy, cx+60, cy, ework );
  1342.     }
  1343.     else {
  1344.         para2[0] = cx; para2[1] = cy;
  1345.         para2[2] = 50; para2[3] = 60;
  1346.         EGB_ellipse( ework, (char *)para2 );
  1347.         line_set( cx, cy, cx+50, cy, ework );
  1348.     }
  1349.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  1350.     if( sw > 1 )goto turn1;
  1351.     if( cx == bx1 && cy == by1 )goto turn1;
  1352.     bx2 = cx; by2 = cy;
  1353.     r = sqrt( (bx1-bx2)*(bx1-bx2) + (by1-by2)*(by1-by2) );
  1354.     tsin1 = (by2-by1)/r; tsin2 = (by2-by1)/r; tcos = (bx2-bx1)/r;
  1355.     if( *dispmode ){
  1356.         tsin1 = tsin1 / 1.2;
  1357.         tsin2 = tsin2 * 1.2;
  1358.     }
  1359.     mp[3] = 0; mp[4] = 0;            /* カーソル仮想原点 */
  1360.     mp[5] = tcos*(ax2-ax1); mp[6] = tsin2*(ax2-ax1);
  1361.     mp[7] = tcos*(ax2-ax1) - tsin1*(ay2-ay1);
  1362.     mp[8] = tsin2*(ax2-ax1) + tcos*(ay2-ay1);
  1363.     mp[9] = -tsin1*(ay2-ay1); mp[10] = tcos*(ay2-ay1);
  1364.     xmid = mp[7] >> 1; ymid = mp[8] >> 1;    /* カーソル用補正 */
  1365.     mp[3] = mp[3] - xmid; mp[4] = mp[4] - ymid;
  1366.     mp[5] = mp[5] - xmid; mp[6] = mp[6] - ymid;
  1367.     mp[7] = mp[7] - xmid; mp[8] = mp[8] - ymid;
  1368.     mp[9] = mp[9] - xmid; mp[10] = mp[10] - ymid;
  1369. turn2:    mouse( mp, 0, 0, 14 );
  1370.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  1371.     if( sw > 1 )goto turn1;
  1372.     bx1 = cx + mp[3]; by1 = cy + mp[4];
  1373.     bx2 = cx + mp[5]; by2 = cy + mp[6];
  1374.     xmax = bx1; xmin = bx1; ymax = by1; ymin = by1;
  1375.     a = tcos*(ax2-ax1) + bx1;
  1376.     if( xmax < a )xmax = a;
  1377.     if( xmin > a )xmin = a;
  1378.     a = tcos*(ax2-ax1) - tsin1*(ay2-ay1) + bx1;
  1379.     if( xmax < a )xmax = a;
  1380.     if( xmin > a )xmin = a;
  1381.     a = -tsin1*(ay2-ay1) + bx1;
  1382.     if( xmax < a )xmax = a;
  1383.     if( xmin > a )xmin = a;
  1384.  
  1385.     a = tsin2*(ax2-ax1) + by1;
  1386.     if( ymax < a )ymax = a;
  1387.     if( ymin > a )ymin = a;
  1388.     a = tsin2*(ax2-ax1) + tcos*(ay2-ay1) + by1;
  1389.     if( ymax < a )ymax = a;
  1390.     if( ymin > a )ymin = a;
  1391.     a = tcos*(ay2-ay1) + by1;
  1392.     if( ymax < a )ymax = a;
  1393.     if( ymin > a )ymin = a;
  1394.  
  1395.     if( xmax > 511 )xmax = 511;
  1396.     if( xmin < 0   )xmin = 0;
  1397.     if( ymax > 511 )ymax = 511;
  1398.     if( ymin < 0   )ymin = 0;
  1399.  
  1400.     para[2] = tcos*65536; para[3] = tsin1*65536;
  1401.     para[4] = -tsin2*65536; para[5] = tcos*65536;
  1402.     para[6] = bx1; para[7] = by1;
  1403.     para[8] = ax1 * 65536; para[9] = ay1 * 65536;
  1404.     para[10] = xmin; para[11] = ymin; para[12] = xmax; para[13] = ymax;
  1405.     para[14] = mix;
  1406.     polygon2(bbuf);
  1407.     matrix17( gwork, para );
  1408.     polygon2(bbuf);
  1409.     goto turn2;
  1410. }
  1411.  
  1412. zoom_copy( pp, mix, gwork, bbuf, ework )
  1413. int pp[], mix;
  1414. char *gwork, *bbuf, *ework;
  1415. {
  1416.     int ax1, ay1, ax2, ay2, sw, cx, cy;
  1417.     int bx1, by1, bx2, by2, ty1, ty2, ty3, ty4;
  1418.     int temp;
  1419.     double ztan;
  1420.     int mp[4], para[16];
  1421.  
  1422.     ax1 = pp[1]; ay1 = pp[2]; ax2 = pp[3]; ay2 = pp[4];
  1423.     para[0] = (unsigned int)bbuf;
  1424.     para[1] = 0x10c;
  1425.     ztan = ( (double)(ay2-ay1) )/(ax2-ax1);
  1426. zoom1:    MOS_disp(1);
  1427.     mouse( mp , 0, 0, 0 );
  1428.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  1429.     MOS_disp(0);
  1430.     if( sw > 1 )return 0;
  1431.     bx1 = cx; by1 = cy;
  1432.     ty1 = by1 - bx1 * ztan; ty2 = by1 + (511-bx1) * ztan;
  1433.     ty3 = by1 + bx1 * ztan; ty4 = by1 - (511-bx1) * ztan;
  1434.     MOS_disp(0);
  1435.     line_set( 0, ty1, 511, ty2, ework );
  1436.     line_set( 0, ty3, 511, ty4, ework );
  1437.     mouse( mp, 0, 0, 4 );
  1438.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  1439.     line_set( 0, ty1, 511, ty2, ework );
  1440.     line_set( 0, ty3, 511, ty4, ework );
  1441.     if( sw > 1 )goto zoom1;
  1442.     if( cx == bx1 || cy == by1 )goto zoom1;
  1443.     bx2 = cx; by2 = cy;
  1444.     para[2] = ( (double)( ax2 - ax1 ) )*65536/( bx2 - bx1 ); para[3] = 0;
  1445.     para[4] = 0; para[5] = ( (double)( ay2 - ay1 ) )*65536/( by2 - by1 );
  1446.     para[6] = bx1; para[7] = by1;
  1447.     para[8] = ax1 * 65536; para[9] = ay1 * 65536;
  1448.     para[10] = bx1; para[11] = by1; para[12] = bx2; para[13] = by2;
  1449.     if( bx1 > bx2 ){
  1450.         temp = para[10];
  1451.         para[10] = para[12];
  1452.         para[12] = temp;
  1453.     }
  1454.     if( by1 > by2 ){
  1455.         temp = para[11];
  1456.         para[11] = para[13];
  1457.         para[13] = temp;
  1458.     }
  1459.     para[14] = mix;
  1460.     polygon2(bbuf);
  1461.     matrix17( gwork, para );
  1462.     polygon2(bbuf);
  1463.     goto zoom1;
  1464. }
  1465.  
  1466. expand_copy( pp, mix, gwork, bbuf, ework)
  1467. int pp[], mix;
  1468. char *gwork, *bbuf, *ework;
  1469. {
  1470.     int ax1, ay1, ax2, ay2, sw, cx, cy;
  1471.     int i, bn, xmin, ymin, xmax, ymax, ax, ay, axm, aym, det;
  1472.     int bx0, by0, bx1, by1, bx2, by2, bx3, by3;
  1473.     int b[6][2], mp[4], para[18];
  1474.  
  1475.     ax1 = pp[1]; ay1 = pp[2]; ax2 = pp[3]; ay2 = pp[4];
  1476.     para[0] = (unsigned int)bbuf;
  1477.     para[1] = 0x10c;
  1478. expnd1:    MOS_disp(1);
  1479.     mouse( mp, 0, 0, 0 );
  1480.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  1481.     MOS_disp(0);
  1482.     if( sw > 1 )return 0;
  1483.     bn = 0; b[0][0] = cx; b[0][1] = cy;
  1484.     while( bn < 3 ){
  1485.         mouse( mp, 0, 0, 2 );
  1486.         sw = mp[0]; cx = mp[1]; cy = mp[2];
  1487.         if( sw > 1 ){
  1488.             if( bn == 0 )goto expnd1;
  1489.             for( i=1 ; i<=bn ; i++ ){    /* やりなおし */
  1490.                 line_set( b[i-1][0], b[i-1][1], b[i][0], b[i][1], ework );
  1491.             }
  1492.             goto expnd1;
  1493.         }
  1494.         bn++; b[bn][0] = cx; b[bn][1] = cy;    /* 次のステップ */
  1495.         line_set( b[bn-1][0], b[bn-1][1], b[bn][0], b[bn][1], ework );
  1496.     }
  1497.     bn = 4; b[4][0] = b[0][0]; b[4][1] = b[0][1];    /* 最後のライン */
  1498.     line_set( b[3][0], b[3][1], b[4][0], b[4][1], ework );
  1499.     for( i=1 ; i<=bn ; i++ ){            /* ライン消し */
  1500.         line_set( b[i-1][0], b[i-1][1], b[i][0], b[i][1], ework );
  1501.     }
  1502.     if( error_check( square_check( b ) ) )goto expnd1;
  1503.     xmin = b[0][0]; xmax = b[0][0]; ymin = b[0][1]; ymax = b[0][1];
  1504.     for( i=0 ; i<4 ; i++ ){                /* 最大,最小 */
  1505.         if( xmin > b[i][0] )xmin = b[i][0];
  1506.         if( xmax < b[i][0] )xmax = b[i][0];
  1507.         if( ymin > b[i][1] )ymin = b[i][1];
  1508.         if( ymax < b[i][1] )ymax = b[i][1];
  1509.     }
  1510.     bx0 = b[0][0]; by0 = b[0][1];
  1511.     bx1 = b[1][0] - bx0; by1 = b[1][1] - by0;
  1512.     bx2 = b[2][0] - bx0; by2 = b[2][1] - by0;
  1513.     bx3 = b[3][0] - bx0; by3 = b[3][1] - by0;
  1514.     ax = ax2 - ax1; ay = ay2 - ay1;
  1515.     det = bx1*by3 - bx3*by1; if( det == 0 )goto expnd1;
  1516.     para[2] =  ( ((double)ax)*by3*65536 )/det;
  1517.     para[3] = -( ((double)ax)*bx3*65536 )/det;
  1518.     para[4] = -( ((double)ay)*by1*65536 )/det;
  1519.     para[5] =  ( ((double)ay)*bx1*65536 )/det;
  1520.     axm = para[2]*bx2 + para[3]*by2;
  1521.     aym = para[4]*bx2 + para[5]*by2;
  1522.     if( axm == 0 || aym == 0 )goto expnd1;
  1523.     para[6] = ( (double)( axm - ax*65536 ) )/ax/aym*65536;
  1524.     para[7] = ( (double)( aym - ay*65536 ) )/ay/axm*65536;
  1525.     para[8] = bx0; para[9] = by0;
  1526.     para[10] = ax1 * 65536; para[11] = ay1 * 65536;
  1527.     para[12] = xmin; para[13] = ymin; para[14] = xmax; para[15] = ymax;
  1528.     para[16] = mix;
  1529.     polygon2(bbuf);
  1530.     expand17( gwork, para );
  1531.     polygon2(bbuf);
  1532.     goto expnd1;
  1533. }
  1534.  
  1535. quad_copy( mix, maskmode, gwork, bbuf, ework)
  1536. int mix, maskmode;
  1537. char *gwork, *bbuf, *ework;
  1538. {
  1539.     int sw, cx, cy;
  1540.     int i, n, xmin, ymin, xmax, ymax;
  1541.     int bx0, by0, bx1, by1, bx2, by2, bx3, by3;
  1542.     int cx0, cy0, cx1, cy1, cx2, cy2, cx3, cy3;
  1543.     double det, ax, ay, axm, aym;
  1544.     int b[6][2], c[6][2], mp[4], para[25], para2[4];
  1545.  
  1546.     polygon2(bbuf);                /* polygon line clear */
  1547. quad0:    para2[0] = (unsigned int)bbuf;        /* 転送画面表示 */
  1548.     para2[1] = 0x10c;
  1549.     para2[2] = 11;            /* mode11:normal change 1990 12 */
  1550.     puta17( gwork, para2 );
  1551. quad1:    MOS_disp(1);
  1552.     mouse( mp, 0, 0, 0 );
  1553.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  1554.     MOS_disp(0);
  1555.     if( sw > 1 ){
  1556.         puta17( gwork, para2 );
  1557.         polygon2(bbuf);
  1558.         return 0;
  1559.     }
  1560.     n = 0; b[0][0] = cx; b[0][1] = cy;
  1561.     while( n < 3 ){
  1562.         mouse( mp, 0, 0, 2 );
  1563.         sw = mp[0]; cx = mp[1]; cy = mp[2];
  1564.         if( sw > 1 ){
  1565.             if( n == 0 )goto quad1;
  1566.             for( i=1 ; i<=n ; i++ ){    /* やりなおし */
  1567.                 line_set( b[i-1][0], b[i-1][1], b[i][0], b[i][1], ework );
  1568.             }
  1569.             goto quad1;
  1570.         }
  1571.         n++; b[n][0] = cx; b[n][1] = cy;    /* 次のステップ */
  1572.         line_set( b[n-1][0], b[n-1][1], b[n][0], b[n][1], ework );
  1573.     }
  1574.     n = 4; b[4][0] = b[0][0]; b[4][1] = b[0][1];    /* 最後のライン */
  1575.     line_set( b[3][0], b[3][1], b[4][0], b[4][1], ework );
  1576.     for( i=1 ; i<=4 ; i++ ){            /* ライン消し */
  1577.         line_set( b[i-1][0], b[i-1][1], b[i][0], b[i][1], ework );
  1578.     }
  1579.     if( error_check( square_check( b ) ) )goto quad1;
  1580.     bx0 = b[0][0];       by0 = b[0][1];
  1581.     bx1 = b[1][0] - bx0; by1 = b[1][1] - by0;
  1582.     bx2 = b[2][0] - bx0; by2 = b[2][1] - by0;
  1583.     bx3 = b[3][0] - bx0; by3 = b[3][1] - by0;
  1584.     det = bx1*by3 - bx3*by1; if( det == 0 )goto quad1;
  1585.     ax = ( by3*bx2 - bx3*by2 )/det;
  1586.     ay = ( -by1*bx2 + bx1*by2 )/det;
  1587.     if( (ax == 0) || (ay == 0) )goto quad1;
  1588.  
  1589.     puta17( gwork, para2 );                /* 元の画面表示 */
  1590. quad2:    for( i=1 ; i<=4 ; i++ ){            /* 転送元 ライン */
  1591.         line_set( b[i-1][0], b[i-1][1], b[i][0], b[i][1], ework );
  1592.     }
  1593. quad3:    if( maskmode == 1 )mask_on(0);
  1594.     if( maskmode == 2 )mask_rev(0);
  1595.     MOS_disp(1);
  1596.     mouse( mp, 0, 0, 0 );
  1597.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  1598.     MOS_disp(0);
  1599.     if( sw > 1 ){
  1600.         for( i=1 ; i<=4 ; i++ ){        /* 転送元ラインdel */
  1601.             line_set( b[i-1][0], b[i-1][1], b[i][0], b[i][1], ework );
  1602.         }
  1603.         goto quad0;
  1604.     }
  1605.     n = 0; c[0][0] = cx; c[0][1] = cy;
  1606.     while( n < 3 ){
  1607.         mouse( mp, 0, 0, 2 );
  1608.         sw = mp[0]; cx = mp[1]; cy = mp[2];
  1609.         if( sw > 1 ){
  1610.             if( n == 0 )goto quad3;
  1611.             for( i=1 ; i<=n ; i++ ){    /* やりなおし */
  1612.                 line_set( c[i-1][0], c[i-1][1], c[i][0], c[i][1], ework );
  1613.             }
  1614.             goto quad3;
  1615.         }
  1616.         n++; c[n][0] = cx; c[n][1] = cy;    /* 次のステップ */
  1617.         line_set( c[n-1][0], c[n-1][1], c[n][0], c[n][1], ework );
  1618.     }
  1619.     n = 4; c[4][0] = c[0][0]; c[4][1] = c[0][1];    /* 最後のライン */
  1620.     line_set( c[3][0], c[3][1], c[4][0], c[4][1], ework );
  1621.     for( i=1 ; i<=n ; i++ ){            /* ライン消し */
  1622.         line_set( c[i-1][0], c[i-1][1], c[i][0], c[i][1], ework );
  1623.     }
  1624.     if( error_check( square_check( c ) ) )goto quad3;
  1625.     xmin = c[0][0]; xmax = c[0][0]; ymin = c[0][1]; ymax = c[0][1];
  1626.     for( i=0 ; i<4 ; i++ ){                /* 最大,最小 */
  1627.         if( xmin > c[i][0] )xmin = c[i][0];
  1628.         if( xmax < c[i][0] )xmax = c[i][0];
  1629.         if( ymin > c[i][1] )ymin = c[i][1];
  1630.         if( ymax < c[i][1] )ymax = c[i][1];
  1631.     }
  1632.     cx0 = c[0][0];       cy0 = c[0][1];
  1633.     cx1 = c[1][0] - cx0; cy1 = c[1][1] - cy0;
  1634.     cx2 = c[2][0] - cx0; cy2 = c[2][1] - cy0;
  1635.     cx3 = c[3][0] - cx0; cy3 = c[3][1] - cy0;
  1636.     det = cx1*cy3 - cx3*cy1; if( det == 0 )goto quad3;
  1637.     para[0] = (unsigned int)bbuf;
  1638.     para[1] = 0x10c;
  1639.     para[2] = cy3/det*65536; para[3] = -cx3/det*65536;
  1640.     para[4] = -cy1/det*65536; para[5] = cx1/det*65536;
  1641.     axm =para[2]*cx2 + para[3]*cy2;
  1642.     aym =para[4]*cx2 + para[5]*cy2;
  1643.     if( axm == 0 || aym == 0 )goto quad3;
  1644.     para[6] = ( axm - 65536 )/aym*65536;
  1645.     para[7] = ( aym - 65536 )/axm*65536;
  1646.     para[8] = ( ax - 1 )*65536;
  1647.     para[9] = ( ay - 1 )*65536;
  1648.     para[10] = bx1*65536;
  1649.     para[11] = bx3*65536;
  1650.     para[12] = by1*65536;
  1651.     para[13] = by3*65536;
  1652.     para[14] = cx0;
  1653.     para[15] = cy0;
  1654.     para[16] = bx0*65536;
  1655.     para[17] = by0*65536;
  1656.     para[18] = xmin; para[19] = ymin; para[20] = xmax; para[21] = ymax;
  1657.     para[22] = 2;
  1658.     para[23] = mix;
  1659.     for( i=1 ; i<=n ; i++ ){            /* ライン消し */
  1660.         line_set( b[i-1][0], b[i-1][1], b[i][0], b[i][1], ework );
  1661.     }
  1662.     quad17( gwork, para );
  1663.     goto quad2;
  1664. }
  1665.  
  1666. focus(focusvar,ework,gwork,bbuf)
  1667. int focusvar[];
  1668. char *ework, *gwork, *bbuf;
  1669. {
  1670.     int min,max,i,j,wt,maskmode,sw,cx,cy;
  1671.     int data[7];
  1672.     char dsp1[] = "<<EFFECT>>                 MASK(          )  CANCEL  LENS   EXIT";
  1673.     char dsp2[] = "SOFT(   )  SHARP(   )  DIZA1( )  DIZA2( )  SMOOTH(rate   rand  )";
  1674.     int mp[4];
  1675.  
  1676.     command_start();            /* 全画面保存 & data clear */
  1677.     maskmode = 0;
  1678. focus1:    windget();
  1679.     gprint( dsp1, 0, 463 );
  1680.     gprint( dsp2, 0, 479 );
  1681.     for( i = 0 ; i < 7 ; i++ )data[i] = -1;
  1682.     focus_dsp(focusvar,data,ework);
  1683.     EGB_color( ework, 0, OFF_COLOR );        /* mask mode display */
  1684.     gprint( "on rev off", 256, 463 );
  1685.     EGB_color( ework, 0, C_COLOR );
  1686.     switch( maskmode ){
  1687.         case 0: gprint( "off", 256+56, 463 );
  1688.             break;
  1689.         case 1: gprint( "on", 256, 463 );
  1690.             break;
  1691.         case 2: gprint( "rev", 256+24, 463 );
  1692.             break;
  1693.     }
  1694. focus2:    MOS_disp(1);
  1695.     mouse( mp, 0, 0, 1 );
  1696.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  1697.     if( cy < 447 )goto focus2;
  1698.     if( cy < 463 ){
  1699.         if( cx < 208 )goto focus2;
  1700.         if( cx < 276 ){            /* mask on 0 */
  1701.             j = 0;
  1702.             goto focus3;
  1703.         }
  1704.         if( cx < 308 ){            /* mask rev 1 */
  1705.             j = 1;
  1706.             goto focus3;
  1707.         }
  1708.         if( cx < 352 ){            /* mask off 2 */
  1709.             j = 2;
  1710.             goto focus3;
  1711.         }
  1712.         if( cx < 416 ){            /* cancel 3 */
  1713.             j = 3;
  1714.             goto focus3;
  1715.         }
  1716.         if( cx < 472 ){            /* lens */
  1717.             i = 0; min = 1; max = 8;
  1718.             goto focus7;
  1719.         }
  1720.         if( cx < 512 ){            /* exit 4 */
  1721.             j = 4;
  1722.             goto focus3;
  1723.         }
  1724.         goto focus2;
  1725.     }
  1726.     if( cy < 480 ){
  1727.         if( cx < 36 ){            /* soft 5 */
  1728.             j = 5;
  1729.             goto focus3;
  1730.         }
  1731.         if( cx < 80 ){            /* rate */
  1732.             i = 1; min = 0; max = 256;
  1733.             goto focus7;
  1734.         }
  1735.         if( cx < 132 ){            /* sharp 6 */
  1736.             j = 6;
  1737.             goto focus3;
  1738.         }
  1739.         if( cx < 172 ){            /* rate */
  1740.             i = 2; min = 0; max = 256;
  1741.             goto focus7;
  1742.         }
  1743.         if( cx < 228 ){            /* diza1 7 */
  1744.             j = 7;
  1745.             goto focus3;
  1746.         }
  1747.         if( cx < 256 ){            /* rate */
  1748.             i = 3; min = 1; max = 8;
  1749.             goto focus7;
  1750.         }
  1751.         if( cx < 308 ){            /* diza2 8 */
  1752.             j = 8;
  1753.             goto focus3;
  1754.         }
  1755.         if( cx < 336 ){            /* rate */
  1756.             i = 4; min = 1; max = 8;
  1757.             goto focus7;
  1758.         }
  1759.         if( cx < 396 ){            /* smooth 9 */
  1760.             j = 9;
  1761.             goto focus3;
  1762.         }
  1763.         if( cx < 460 ){            /* rate */
  1764.             i = 5; min = 0; max = 32;
  1765.             goto focus7;
  1766.         }
  1767.         if( cx < 512 ){            /* rand# */
  1768.             i = 6; min = 0; max = 99;
  1769.             goto focus7;
  1770.         }
  1771.         goto focus2;
  1772.     }
  1773.     goto focus2;
  1774.  
  1775. focus3:    mouse( mp, 0, 0, 0 );
  1776.     if( sw > 1 )goto focus2;
  1777.     MOS_disp(0);
  1778.     windput();
  1779.     switch( j ){
  1780.         case 0:    mask_on(1);        /* mask on */
  1781.             maskmode = 1;
  1782.             break;
  1783.         case 1:    mask_rev(1);        /* mask off */
  1784.             maskmode = 2;
  1785.             break;
  1786.         case 2:    vpoly1();        /* mask off */
  1787.             maskmode = 0;
  1788.             break;
  1789.         case 3:    backupput();        /* cancel */
  1790.             if( maskmode == 1 )mask_on(0);
  1791.             if( maskmode == 2 )mask_rev(0);
  1792.             break;
  1793.         case 4: command_end(bbuf);    /* exit */
  1794.             return 0;
  1795.         case 5: lens_set( focusvar[0] );    /* soft */
  1796.             focus_set( focusvar[1], gwork, bbuf );
  1797.             lens_rest( focusvar[0] );
  1798.             break;
  1799.         case 6: lens_set( focusvar[0] );    /* sharp */
  1800.             focus_set( -focusvar[2], gwork, bbuf );
  1801.             lens_rest( focusvar[0] );
  1802.             break;
  1803.         case 7: lens_set( focusvar[0] );    /* diza1 */
  1804.             diza( 0, focusvar[3], bbuf );
  1805.             lens_rest( focusvar[0] );
  1806.             break;
  1807.         case 8: lens_set( focusvar[0] );    /* diza2 */
  1808.             diza( 1, focusvar[4], bbuf );
  1809.             lens_rest( focusvar[0] );
  1810.             break;
  1811.         case 9: lens_set( focusvar[0] );    /* smooth */
  1812.             smooth( focusvar[5], focusvar[6], bbuf );
  1813.             lens_rest( focusvar[0] );
  1814.             break;
  1815.     }
  1816.     goto focus1;
  1817.  
  1818. focus7:    wt = 20;
  1819. focus8:    if( sw == 1 )focusvar[i] = focusvar[i] + 1;
  1820.     if( sw == 2 )focusvar[i] = focusvar[i] - 1;
  1821.     if( focusvar[i] < min )focusvar[i] = max;
  1822.     if( focusvar[i] > max )focusvar[i] = min;
  1823.     focus_dsp(focusvar,data,ework);
  1824.     vsync_wait( wt );
  1825.     wt = 2;
  1826.     MOS_rdpos(&sw,&cx,&cy);
  1827.     if( sw > 0 )goto focus8;
  1828.     goto focus2;
  1829. }
  1830.  
  1831. focus_dsp(focusvar,data,ework)
  1832. int focusvar[], data[];
  1833. char *ework;
  1834. {
  1835.     int i, x, y;
  1836.     int point[][3] = {    { 456,463,1 },    /* lens */
  1837.                 {  40,479,3 },
  1838.                 { 136,479,3 },
  1839.                 { 232,479,1 },
  1840.                 { 312,479,1 },
  1841.                 { 432,479,2 },
  1842.                 { 488,479,2 }
  1843.                };
  1844.     char dsp[10];
  1845.  
  1846.     EGB_color(ework,0,C_COLOR);
  1847.     for( i = 0 ; i < 7 ; i++ ){
  1848.         if( data[i] != focusvar[i] ){
  1849.             x = point[i][0]; y = point[i][1];
  1850.             MOS_disp(0);
  1851.             itochar( focusvar[i], point[i][2], dsp );
  1852.             gprint2( dsp, x, y );
  1853.             data[i] = focusvar[i];
  1854.         }
  1855.     }
  1856.     return 0;
  1857. }
  1858.  
  1859. focus_set( rate, gwork, bbuf )
  1860. int rate;
  1861. char *gwork, *bbuf;
  1862. {
  1863.     int i;
  1864.     int mp[4], pp[6], para[16];
  1865.  
  1866.     para[0] = (unsigned int)bbuf;
  1867.     para[1] = 0x10c;
  1868.     for( i=0 ; i<=8 ; i++ )para[i+2] = ( rate >> 3 );
  1869.     para[6] = 256 - para[2]*8;
  1870. foc01:    MOS_disp(1);
  1871.     if( polygon1( pp, bbuf ) ){
  1872.         mouse( mp, 0, 0, 0 );
  1873.         return 0;
  1874.     }
  1875.     polygon2(bbuf);
  1876.     para[11] = pp[1]; para[12] = pp[2];
  1877.     para[13] = pp[3]; para[14] = pp[4];
  1878.     focus17( gwork, para );
  1879.     goto foc01;
  1880. }
  1881.  
  1882.     /* 新しいrand()が合わなくなったんで自家製に切り換え 1993 3/6 */
  1883. my_rand()
  1884. {
  1885.     static unsigned int next = 1 ;
  1886.  
  1887.     next = next * 1103515245 + 12345 ;
  1888.     return (unsigned int)( next / 65536 ) % 32768 ;
  1889. }
  1890.  
  1891. diza( mode, rate, bbuf )
  1892. int mode, rate;
  1893. char *bbuf;
  1894. {
  1895.     int i, j, n, data, b, r, g, div, rnd;
  1896.     int mp[4], pp[6];
  1897.  
  1898.     div = 32768/(rate*2+1);
  1899. diza1:    MOS_disp(1);
  1900.     if( polygon1( pp, bbuf ) ){
  1901.         mouse( mp, 0, 0, 0 );
  1902.         return 0;
  1903.     }
  1904.     polygon2(bbuf);
  1905.     for( i=pp[2] ; i<=pp[4] ; i++ ){
  1906.         for( j=pp[1] ; j<=pp[3] ; j++ ){
  1907.             n = ( i << 10 ) + ( j << 1 );
  1908.             if( ( peekw( (unsigned int)n, 0x10c ) < 0x8000 ) && ( WORD( bbuf + n ) >= 0x8000 ) ){
  1909.                 data = WORD( bbuf + n );
  1910.                 b = data & 0x1f;
  1911.                 r = (data & 0x3e0) >> 5;
  1912.                 g = (data & 0x7c00) >> 10;
  1913.                 if( mode == 0 ){
  1914.                     b = b + my_rand()/div - rate;
  1915.                     r = r + my_rand()/div - rate;
  1916.                     g = g + my_rand()/div - rate;
  1917.                 }
  1918.                 else {
  1919.                     rnd = my_rand()/div - rate;
  1920.                     b = b + rnd;
  1921.                     r = r + rnd;
  1922.                     g = g + rnd;
  1923.                 }
  1924.                 if( b < 0 )b = 0;
  1925.                 if( b > 0x1f )b =0x1f;
  1926.                 if( r < 0 )r = 0;
  1927.                 if( r > 0x1f )r =0x1f;
  1928.                 if( g < 0 )g = 0;
  1929.                 if( g > 0x1f )g =0x1f;
  1930.                 pokew( (unsigned int)n, 0x10c, b+(r << 5)+(g << 10) );
  1931.             }
  1932.         }
  1933.     }
  1934.     goto diza1;
  1935. }
  1936.  
  1937. smooth( rate, rnd, bbuf )
  1938. int rate, rnd;
  1939. char *bbuf;
  1940. {
  1941.     int ax1, ay1, ax2, ay2, a, b, c, d, cmp, start, mid, fine, mode, r, s, x, y, vadd;
  1942.     int k0, k1, k2;
  1943.     int mp[4], pp[6];
  1944.  
  1945. smoo1:    MOS_disp(1);
  1946.     if( polygon1( pp, bbuf ) ){
  1947.         mouse( mp, 0, 0, 0 );
  1948.         return 0;
  1949.     }
  1950.     polygon2(bbuf);
  1951.     ax1 = pp[1]; ay1 = pp[2]; ax2 = pp[3]; ay2 = pp[4];
  1952.     s = 32 - rate;            /* sharp rate */
  1953.     r = rnd;
  1954.  
  1955.     for( y=ay1+1 ; y<=ay2-1 ; y++ ){
  1956.         vadd = y*1024; mode = 0;
  1957.         for( x=ax1+1 ; x<=ax2-1 ; x++ ){
  1958.             a=WORD(bbuf+vadd+x*2);
  1959.             b=WORD(bbuf+vadd+x*2+1024);
  1960.             c=WORD(bbuf+vadd+x*2+2);
  1961.             d=WORD(bbuf+vadd+x*2-1022);
  1962.             cmp = cmpdata( a, b, s );
  1963.             if( (mode == 0) && cmp ){
  1964.                 mode = 1;
  1965.                 start = x;
  1966.                 k0 = 0;
  1967.             }
  1968.             if( (mode == 1) && (cmp == 0) )mode = 0;
  1969.             if( (mode == 2) && (cmpdata( a, d, s ) == 0) ){
  1970.                 mode = 0;
  1971.                 fine = x;
  1972.                 smooth1( start, mid, fine, y, r, bbuf );
  1973.                 x = mid;
  1974.             }
  1975.             if( mode == 1 ){
  1976.               k1 = katamuki( x, y, bbuf );
  1977.               if( cmpdata(a,c,s) ){
  1978.                 if( (k1 <= k0) && (k1 < 0) ){
  1979.                   k2 = katamuki( x+1, y, bbuf );
  1980.                   if( (k1 <= k2) || (cmpdata(b,c,12) == 0) ){
  1981.                 mode = 2;
  1982.                 mid = x;
  1983.                   }
  1984.                 }
  1985.               }
  1986.               k0 = k1;
  1987.             }
  1988.             if( (mode == 2) && (cmpdata( c, d, s ) == 0) ){
  1989.                 mode = 0;
  1990.                 fine = x;
  1991.                 smooth1( start, mid, fine, y, r, bbuf );
  1992.                 x = mid;
  1993.             }
  1994.         }
  1995.     }
  1996.  
  1997.     for( y=ay1+1 ; y<=ay2-1 ; y++ ){
  1998.         vadd = y*1024; mode = 0;
  1999.         for( x=ax2-1 ; x>=ax1+1 ; x-- ){
  2000.             a=WORD(bbuf+vadd+x*2);
  2001.             b=WORD(bbuf+vadd+x*2+1024);
  2002.             c=WORD(bbuf+vadd+x*2-2);
  2003.             d=WORD(bbuf+vadd+x*2-1026);
  2004.             cmp = cmpdata( a, b, s );
  2005.             if( (mode == 0) && cmp ){
  2006.                 mode = 1;
  2007.                 start = x;
  2008.                 k0 = 0;
  2009.             }
  2010.             if( (mode == 1) && (cmp == 0) )mode = 0;
  2011.             if( (mode == 2) && (cmpdata( a, d, s ) == 0) ){
  2012.                 mode = 0;
  2013.                 fine = x;
  2014.                 smooth2( start, mid, fine, y, r, bbuf );
  2015.                 x = mid;
  2016.             }
  2017.             if( mode == 1 ){
  2018.               k1 = katamuki( x, y, bbuf );
  2019.               if( cmpdata(a,c,s) ){
  2020.                 if( (k1 >= k0) && (k1 > 0) ){
  2021.                   k2 = katamuki( x-1, y, bbuf );
  2022.                   if( (k1 >= k2) || (cmpdata(b,c,12) == 0) ){
  2023.                 mode = 2;
  2024.                 mid = x;
  2025.                   }
  2026.                 }
  2027.               }
  2028.               k0 = k1;
  2029.             }
  2030.             if( (mode == 2) && (cmpdata( c, d, s ) == 0) ){
  2031.                 mode = 0;
  2032.                 fine = x;
  2033.                 smooth2( start, mid, fine, y, r, bbuf );
  2034.                 x = mid;
  2035.             }
  2036.         }
  2037.     }
  2038.  
  2039.     for( x=ax1+1 ; x<=ax2-1 ; x++ ){
  2040.         vadd = x*2; mode = 0;
  2041.         for( y=ay1+1 ; y<=ay2-1 ; y++ ){
  2042.             a=WORD(bbuf+vadd+y*1024);
  2043.             b=WORD(bbuf+vadd+y*1024+2);
  2044.             c=WORD(bbuf+vadd+y*1024+1024);
  2045.             d=WORD(bbuf+vadd+y*1024+1022);
  2046.             cmp = cmpdata( a, b, s );
  2047.             if( (mode == 0) && cmp ){
  2048.                 mode = 1;
  2049.                 start = y;
  2050.                 k0 = 0;
  2051.             }
  2052.             if( (mode == 1) && (cmp == 0) )mode = 0;
  2053.             if( (mode == 2) && (cmpdata( a, d, s ) == 0) ){
  2054.                 mode = 0;
  2055.                 fine = y;
  2056.                 smooth3( start, mid, fine, x, r, bbuf );
  2057.                 y = mid;
  2058.             }
  2059.             if( mode == 1 ){
  2060.               k1 = katamuki( x, y, bbuf );
  2061.               if( cmpdata(a,c,s) ){
  2062.                 if( (k1 <= k0) && (k1 < 0) ){
  2063.                   k2 = katamuki( x, y+1, bbuf );
  2064.                   if( (k1 <= k2) || (cmpdata(b,c,12) == 0) ){
  2065.                 mode = 2;
  2066.                 mid = y;
  2067.                   }
  2068.                 }
  2069.               }
  2070.               k0 = k1;
  2071.             }
  2072.             if( (mode == 2) && (cmpdata( c, d, s ) == 0) ){
  2073.                 mode = 0;
  2074.                 fine = y;
  2075.                 smooth3( start, mid, fine, x, r, bbuf );
  2076.                 y = mid;
  2077.             }
  2078.         }
  2079.     }
  2080.  
  2081.     for( x=ax2-1 ; x>=ax1+1 ; x-- ){
  2082.         vadd = x*2; mode = 0;
  2083.         for( y=ay1+1 ; y<=ay2-1 ; y++ ){
  2084.             a=WORD(bbuf+vadd+y*1024);
  2085.             b=WORD(bbuf+vadd+y*1024-2);
  2086.             c=WORD(bbuf+vadd+y*1024+1024);
  2087.             d=WORD(bbuf+vadd+y*1024+1026);
  2088.             cmp = cmpdata( a, b, s );
  2089.             if( (mode == 0) && cmp ){
  2090.                 mode = 1;
  2091.                 start = y;
  2092.                 k0 = 0;
  2093.             }
  2094.             if( (mode == 1) && (cmp == 0) )mode = 0;
  2095.             if( (mode == 2) && (cmpdata( a, d, s ) == 0) ){
  2096.                 mode = 0;
  2097.                 fine = y;
  2098.                 smooth4( start, mid, fine, x, r, bbuf );
  2099.                 y = mid;
  2100.             }
  2101.             if( mode == 1 ){
  2102.               k1 = katamuki( x, y, bbuf );
  2103.               if( cmpdata(a,c,s) ){
  2104.                 if( (k1 >= k0) && (k1 > 0) ){
  2105.                   k2 = katamuki( x, y+1, bbuf );
  2106.                   if( (k1 >= k2) || (cmpdata(b,c,12) == 0) ){
  2107.                 mode = 2;
  2108.                 mid = y;
  2109.                   }
  2110.                 }
  2111.               }
  2112.               k0 = k1;
  2113.             }
  2114.             if( (mode == 2) && (cmpdata( c, d, s ) == 0) ){
  2115.                 mode = 0;
  2116.                 fine = y;
  2117.                 smooth4( start, mid, fine, x, r, bbuf );
  2118.                 y = mid;
  2119.             }
  2120.         }
  2121.     }
  2122.     goto smoo1;
  2123. }
  2124.  
  2125. katamuki( x, y, bbuf )        /* return=(karamuki + or 0 or -) s=rate */
  2126. int x, y;
  2127. char *bbuf;
  2128. {
  2129.     int p[3][3];
  2130.     int vadd, ck;
  2131.  
  2132.     vadd = y*1024; ck = 0;
  2133.     if( (vadd+x*2-1026 < 0) || (vadd+x*2+1026 > 524286) )return 0;
  2134.     p[0][0]=WORD(bbuf+vadd+x*2-1026);
  2135.     p[0][1]=WORD(bbuf+vadd+x*2-1024);
  2136.     p[0][2]=WORD(bbuf+vadd+x*2-1022);
  2137.     p[1][0]=WORD(bbuf+vadd+x*2-2);
  2138.     p[1][1]=WORD(bbuf+vadd+x*2);
  2139.     p[1][2]=WORD(bbuf+vadd+x*2+2);
  2140.     p[2][0]=WORD(bbuf+vadd+x*2+1022);
  2141.     p[2][1]=WORD(bbuf+vadd+x*2+1024);
  2142.     p[2][2]=WORD(bbuf+vadd+x*2+1026);
  2143.  
  2144.     ck = ck - kata_s( p[0][0], p[1][1] );
  2145.     ck = ck - kata_s( p[0][1], p[1][2] );
  2146.     ck = ck - kata_s( p[1][0], p[2][1] );
  2147.     ck = ck - kata_s( p[1][1], p[2][2] );
  2148.  
  2149.     ck = ck + kata_s( p[0][1], p[1][0] );
  2150.     ck = ck + kata_s( p[0][2], p[1][1] );
  2151.     ck = ck + kata_s( p[1][1], p[2][0] );
  2152.     ck = ck + kata_s( p[1][2], p[2][1] );
  2153.  
  2154.     return ck;
  2155. }
  2156.  
  2157. kata_s( a, b )        /* total abs(sub) */
  2158. int a, b;
  2159. {
  2160.     int data1, data2, subd, add;
  2161.  
  2162.     data1 = a & 0x1f; data2 = b & 0x1f;
  2163.     subd = data2 - data1; if( subd < 0 )subd = -subd;
  2164.     add = subd;
  2165.     data1 = (a >> 5) & 0x1f; data2 = (b >> 5) & 0x1f;
  2166.     subd = data2 - data1; if( subd < 0 )subd = -subd;
  2167.     add = add + subd;
  2168.     data1 = (a >> 10) & 0x1f; data2 = (b >> 10) & 0x1f;
  2169.     subd = data2 - data1; if( subd < 0 )subd = -subd;
  2170.     add = add + subd;
  2171.     return add;
  2172. }
  2173.  
  2174. cmpdata( a, b, rate )
  2175. int a, b, rate;
  2176. {
  2177.     int data1, data2, subd;
  2178.  
  2179.     data1 = a & 0x1f; data2 = b & 0x1f;
  2180.     subd = data2 - data1; if( subd < 0 )subd = -subd;
  2181.     if( subd > rate )return 1;
  2182.     data1 = (a >> 5) & 0x1f; data2 = (b >> 5) & 0x1f;
  2183.     subd = data2 - data1; if( subd < 0 )subd = -subd;
  2184.     if( subd > rate )return 1;
  2185.     data1 = (a >> 10) & 0x1f; data2 = (b >> 10) & 0x1f;
  2186.     subd = data2 - data1; if( subd < 0 )subd = -subd;
  2187.     if( subd > rate )return 1;
  2188.     return 0;
  2189. }
  2190.  
  2191. smooth1( st, md, fn, y, r, bbuf )        /* r=random( 0-256 ) */
  2192. int st, md, fn, y, r;
  2193. char *bbuf;
  2194. {
  2195.     int x1, x2, x3;
  2196.     int i, n, top, rate, a, b, c;
  2197.  
  2198.     x1 = ( st + md ) >> 1;
  2199.     x2 = md;
  2200.     x3 = ( md + fn + 1 ) >> 1;
  2201.     top = y*1024;
  2202.     if( x1 == x2 )goto smoo1;
  2203.     rate = 128/(x2-x1+1);
  2204.     n = 1;
  2205.     for( i=x1 ; i<=x2-1 ; i++ ){
  2206.         a = WORD( bbuf+top+i*2+1024 );
  2207.         b = peekw( top+i*2, 0x10c );
  2208.         if( (WORD( bbuf+top+i*2 ) & 0x8000) && (b < 0x8000) ){
  2209.             c = mix( a, b, n*rate, r );
  2210.             pokew( top+i*2, 0x10c, c );
  2211.         }
  2212.         n++;
  2213.     }
  2214.     if( x2 == x3 )goto smoo2;
  2215. smoo1:    if( x2 == x3 )return 0;
  2216.     rate = 128/(x3-x2+1);
  2217.     n = 1;
  2218.     for( i=x2+1 ; i<=x3 ; i++ ){
  2219.         a = WORD( bbuf+top+i*2-1024 );
  2220.         b = peekw( top+i*2, 0x10c );
  2221.         if( (WORD( bbuf+top+i*2 ) & 0x8000) && (b < 0x8000) ){
  2222.             c = mix( a, b, (128 - n*rate), r );
  2223.             pokew( top+i*2, 0x10c, c );
  2224.         }
  2225.         n++;
  2226.     }
  2227. smoo2:    a = peekw( top+x2*2-2, 0x10c );
  2228.     b = peekw( top+x2*2+2, 0x10c );
  2229.     if( (WORD( bbuf+top+x2*2 ) & 0x8000) && (b < 0x8000) ){
  2230.         c = mix( a, b, 128, r );
  2231.         pokew( top+x2*2, 0x10c, c );
  2232.     }
  2233.     return 0;
  2234. }
  2235.  
  2236. smooth2( st, md, fn, y, r, bbuf )        /* r=random( 0-256 ) */
  2237. int st, md, fn, y, r;
  2238. char *bbuf;
  2239. {
  2240.     int x1, x2, x3;
  2241.     int i, n, top, rate, a, b, c;
  2242.  
  2243.     x1 = ( st + md + 1 ) >> 1;
  2244.     x2 = md;
  2245.     x3 = ( md + fn ) >> 1;
  2246.     top = y*1024;
  2247.     if( x1 == x2 )goto smoo1;
  2248.     rate = 128/(x1-x2+1);
  2249.     n = 1;
  2250.     for( i=x1 ; i>=x2+1 ; i-- ){
  2251.         a = WORD( bbuf+top+i*2+1024 );
  2252.         b = peekw( top+i*2, 0x10c );
  2253.         if( (WORD( bbuf+top+i*2 ) & 0x8000) && (b < 0x8000) ){
  2254.             c = mix( a, b, n*rate, r );
  2255.             pokew( top+i*2, 0x10c, c );
  2256.         }
  2257.         n++;
  2258.     }
  2259.     if( x2 == x3 )goto smoo2;
  2260. smoo1:    if( x2 == x3 )return 0;
  2261.     rate = 128/(x2-x3+1);
  2262.     n = 1;
  2263.     for( i=x2-1 ; i>=x3 ; i-- ){
  2264.         a = WORD( bbuf+top+i*2-1024 );
  2265.         b = peekw( top+i*2, 0x10c );
  2266.         if( (WORD( bbuf+top+i*2 ) & 0x8000) && (b < 0x8000) ){
  2267.             c = mix( a, b, (128 - n*rate), r );
  2268.             pokew( top+i*2, 0x10c, c );
  2269.         }
  2270.         n++;
  2271.     }
  2272. smoo2:    a = peekw( top+x2*2+2, 0x10c );
  2273.     b = peekw( top+x2*2-2, 0x10c );
  2274.     if( (WORD( bbuf+top+x2*2 ) & 0x8000) && (b < 0x8000) ){
  2275.         c = mix( a, b, 128, r );
  2276.         pokew( top+x2*2, 0x10c, c );
  2277.     }
  2278.     return 0;
  2279. }
  2280.  
  2281. smooth3( st, md, fn, x, r, bbuf )
  2282. int st, md, fn, x, r;
  2283. char *bbuf;
  2284. {
  2285.     int y1, y2, y3;
  2286.     int i, n, top, rate, a, b, c;
  2287.  
  2288.     y1 = ( st + md ) >> 1;
  2289.     y2 = md;
  2290.     y3 = ( md + fn ) >> 1;
  2291.     top = x*2;
  2292.     if( y1 == y2 )goto smoo1;
  2293.     rate = 128/(y2-y1+1);
  2294.     n = 1;
  2295.     for( i=y1 ; i<=y2-1 ; i++ ){
  2296.         a = WORD( bbuf+top+i*1024+2 );
  2297.         b = peekw( top+i*1024, 0x10c );
  2298.         if( (WORD( bbuf+top+i*1024 ) & 0x8000) && (b < 0x8000) ){
  2299.             c = mix( a, b, n*rate, r );
  2300.             pokew( top+i*1024, 0x10c, c );
  2301.         }
  2302.         n++;
  2303.     }
  2304.     if( y2 == y3 )goto smoo2;
  2305. smoo1:    if( y2 == y3 )return 0;
  2306.     rate = 128/(y3-y2+1);
  2307.     n = 1;
  2308.     for( i=y2+1 ; i<=y3 ; i++ ){
  2309.         a = WORD( bbuf+top+i*1024-2 );
  2310.         b = peekw( top+i*1024, 0x10c );
  2311.         if( (WORD( bbuf+top+i*1024 ) & 0x8000) && (b < 0x8000) ){
  2312.             c = mix( a, b, (128 - n*rate), r );
  2313.             pokew( top+i*1024, 0x10c, c );
  2314.         }
  2315.         n++;
  2316.     }
  2317. smoo2:    a = peekw( top+y2*1024+1024, 0x10c );
  2318.     b = peekw( top+y2*1024-1024, 0x10c );
  2319.     if( (WORD( bbuf+top+y2*1024 ) & 0x8000) && (b < 0x8000) ){
  2320.         c = mix( a, b, 128, r );
  2321.         pokew( top+y2*1024, 0x10c, c );
  2322.     }
  2323.     return 0;
  2324. }
  2325.  
  2326. smooth4( st, md, fn, x, r, bbuf )
  2327. int st, md, fn, x, r;
  2328. char *bbuf;
  2329. {
  2330.     int y1, y2, y3;
  2331.     int i, n, top, rate, a, b, c;
  2332.  
  2333.     y1 = ( st + md ) >> 1;
  2334.     y2 = md;
  2335.     y3 = ( md + fn ) >> 1;
  2336.     top = x*2;
  2337.     if( y1 == y2 )goto smoo1;
  2338.     rate = 128/(y2-y1+1);
  2339.     n = 1;
  2340.     for( i=y1 ; i<=y2-1 ; i++ ){
  2341.         a = WORD( bbuf+top+i*1024-2 );
  2342.         b = peekw( top+i*1024, 0x10c );
  2343.         if( (WORD( bbuf+top+i*1024 ) & 0x8000) && (b < 0x8000) ){
  2344.             c = mix( a, b, n*rate, r );
  2345.             pokew( top+i*1024, 0x10c, c );
  2346.         }
  2347.         n++;
  2348.     }
  2349.     if( y2 == y3 )goto smoo2;
  2350. smoo1:    if( y2 == y3 )return 0;
  2351.     rate = 128/(y3-y2+1);
  2352.     n = 1;
  2353.     for( i=y2+1 ; i<=y3 ; i++ ){
  2354.         a = WORD( bbuf+top+i*1024+2 );
  2355.         b = peekw( top+i*1024, 0x10c );
  2356.         if( (WORD( bbuf+top+i*1024 ) & 0x8000) && (b < 0x8000) ){
  2357.             c = mix( a, b, (128 - n*rate), r );
  2358.             pokew( top+i*1024, 0x10c, c );
  2359.         }
  2360.         n++;
  2361.     }
  2362. smoo2:    a = peekw( top+y2*1024+1024, 0x10c );
  2363.     b = peekw( top+y2*1024-1024, 0x10c );
  2364.     if( (WORD( bbuf+top+y2*1024 ) & 0x8000) && (b < 0x8000) ){
  2365.         c = mix( a, b, 128, r );
  2366.         pokew( top+y2*1024, 0x10c, c );
  2367.     }
  2368.     return 0;
  2369. }
  2370.  
  2371. mix( a, b, rate, r )    /* r = random rate ( 0-256 ) ( rate +-r ) */
  2372. int a, b, rate, r;
  2373. {
  2374.     int div, rate1, data, data1, data2, add;
  2375.  
  2376.     div = 32768/(r*2 + 1);
  2377.  
  2378.     rate1 = rate + my_rand()/div - r;
  2379.     if( rate1 < 0 )rate1 = 0;
  2380.     if( rate1 > 256 )rate1 = 256;
  2381.     data1 = a & 0x1f; data2 = b & 0x1f;
  2382.     add = ( data1*rate1 + data2*(256-rate1) + 0x80 ) >> 8;
  2383.     data = add;
  2384.  
  2385.     rate1 = rate + my_rand()/div - r;
  2386.     if( rate1 < 0 )rate1 = 0;
  2387.     if( rate1 > 256 )rate1 = 256;
  2388.     data1 = (a >> 5) & 0x1f; data2 = (b >> 5) & 0x1f;
  2389.     add = ( data1*rate1 + data2*(256-rate1) + 0x80 ) >> 8;
  2390.     data = data + ( add << 5 );
  2391.  
  2392.     rate1 = rate + my_rand()/div - r;
  2393.     if( rate1 < 0 )rate1 = 0;
  2394.     if( rate1 > 256 )rate1 = 256;
  2395.     data1 = (a >> 10) & 0x1f; data2 = (b >> 10) & 0x1f;
  2396.     add = ( data1*rate1 + data2*(256-rate1) + 0x80 ) >> 8;
  2397.     data = data + ( add << 10 );
  2398.     return data;
  2399. }
  2400.  
  2401. zoom( zvar, ework, gwork, bbuf )
  2402. int zvar[];
  2403. char *ework, *gwork, *bbuf;
  2404. {
  2405.     int min,max,i,j,wt,sw,cx,cy;
  2406.     int data[9], mp[4], para[20];
  2407.     char dsp1[] = "<<HG-ZOOM>>  HG-ZOOM  SHARP                         CANCEL  EXIT";
  2408.     char dsp2[] = "SOURCE(   ,    )-(   ,    ) → DESTINATINO(   ,    )-(   ,    )";
  2409.  
  2410.     command_start();            /* 全画面保存 & data clear */
  2411. zoom01:    windget();
  2412.     gprint( dsp1, 0, 463 );
  2413.     gprint( dsp2, 0, 479 );
  2414.     for( i = 0 ; i < 9 ; i++ )data[i] = -1000;
  2415.     zoom_dsp( zvar, data, ework );
  2416. zoom02:    MOS_disp(1);
  2417.     mouse( mp, 0, 0, 1 );
  2418.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  2419.     if( cy < 447 )goto zoom02;
  2420.     if( cy < 463 ){
  2421.         if( cx < 96 )goto zoom02;
  2422.         if( cx < 168 ){            /* zoom 0 */
  2423.             j = 0;
  2424.             goto zoom03;
  2425.         }
  2426.         if( cx < 248 ){            /* sharp */
  2427.             i = 8; min = -256; max = 256;
  2428.             goto zoom07;
  2429.         }
  2430.         if( cx < 408 )goto zoom02;    /* nothing */
  2431.         if( cx < 472 ){
  2432.             j = 1;
  2433.             goto zoom03;
  2434.         }
  2435.         if( cx < 512 ){            /* exit -> 2 */
  2436.             j = 2;
  2437.             goto zoom03;
  2438.         }
  2439.         goto zoom02;
  2440.     }
  2441.     if( cy < 480 ){
  2442.         if( cx < 52 ){            /* source -> 3 */
  2443.             j = 3;
  2444.             goto zoom03;
  2445.         }
  2446.         if( cx < 88 ){            /* xs1 */
  2447.             i = 0; min = 0; max = 511;
  2448.             goto zoom07;
  2449.         }
  2450.         if( cx < 132 ){            /* ys1 */
  2451.             i = 1; min = 0; max = 511;
  2452.             goto zoom07;
  2453.         }
  2454.         if( cx < 176 ){            /* xs2 */
  2455.             i = 2; min = 0; max = 511;
  2456.             goto zoom07;
  2457.         }
  2458.         if( cx < 232 ){            /* ys2 */
  2459.             i = 3; min = 0; max = 511;
  2460.             goto zoom07;
  2461.         }
  2462.         if( cx < 340 ){            /* destination -> 4 */
  2463.             j = 4;
  2464.             goto zoom03;
  2465.         }
  2466.         if( cx < 376 ){            /* xd1 */
  2467.             i = 4; min = 0; max = 511;
  2468.             goto zoom07;
  2469.         }
  2470.         if( cx < 420 ){            /* yd1 */
  2471.             i = 5; min = 0; max = 511;
  2472.             goto zoom07;
  2473.         }
  2474.         if( cx < 464 ){            /* xd2 */
  2475.             i = 6; min = 0; max = 511;
  2476.             goto zoom07;
  2477.         }
  2478.         if( cx < 512 ){            /* yd2 */
  2479.             i = 7; min = 0; max = 511;
  2480.             goto zoom07;
  2481.         }
  2482.         goto zoom02;
  2483.     }
  2484.     goto zoom02;
  2485. zoom03:    mouse( mp, 0, 0, 0 );
  2486.     if( sw > 1 )goto zoom02;
  2487.     MOS_disp(0);
  2488.     windput();
  2489.     switch( j ){
  2490.         case 0: zooming( zvar, bbuf );        /* ZOOM */
  2491.             break;
  2492.         case 1: backupput();        /* cancel */
  2493.             break;
  2494.         case 2: return 0;
  2495.         case 3: lens_set( 1 );        /* source coodrna. */
  2496.             para[0] = (unsigned int)bbuf;    /* 画面change */
  2497.             para[1] = 0x10c;
  2498.             para[2] = 0;
  2499.             puta17( gwork, para );
  2500.             zoom_coodr( zvar );
  2501.             MOS_disp(0);
  2502.             puta17( gwork, para );
  2503.             lens_rest( 1 );
  2504.             break;
  2505.         case 4: lens_set( 1 );        /* desti. coodrna. */
  2506.             zoom_coodr( zvar + 4 );
  2507.             lens_rest( 1 );
  2508.             break;
  2509.     }
  2510.     goto zoom01;
  2511. zoom07:    wt = 20;
  2512. zoom08:    if( sw == 1 )zvar[i] = zvar[i] + 1;
  2513.     if( sw == 2 )zvar[i] = zvar[i] - 1;
  2514.     if( zvar[i] < min )zvar[i] = max;
  2515.     if( zvar[i] > max )zvar[i] = min;
  2516.     zoom_dsp( zvar, data, ework );
  2517.     vsync_wait( wt );
  2518.     wt = 2;
  2519.     MOS_rdpos(&sw,&cx,&cy);
  2520.     if( sw > 0 )goto zoom08;
  2521.     goto zoom02;
  2522. }
  2523.  
  2524. zoom_dsp( zvar, data, ework )
  2525. int zvar[], data[];
  2526. char *ework;
  2527. {
  2528.     int i;
  2529.     int point[][3] = {    {  56,479,3 },
  2530.                 {  96,479,3 },
  2531.                 { 144,479,3 },
  2532.                 { 184,479,3 },
  2533.  
  2534.                 { 344,479,3 },
  2535.                 { 384,479,3 },
  2536.                 { 432,479,3 },
  2537.                 { 472,479,3 },
  2538.  
  2539.                 { 216,463,3 }
  2540.               };
  2541.     char dsp[6];
  2542.  
  2543.     for( i = 0 ; i < 9 ; i++ ){
  2544.         if( data[i] != zvar[i] ){
  2545.             MOS_disp(0);
  2546.             if( i == 8 )gprint2("    ", point[i][0], point[i][1]);
  2547.             itochar( zvar[i], point[i][2], dsp );
  2548.             EGB_color(ework,0,C_COLOR);
  2549.             gprint2( dsp, point[i][0], point[i][1] );
  2550.             data[i] = zvar[i];
  2551.         }
  2552.     }
  2553.     return 0;
  2554. }
  2555.  
  2556. zoom_coodr( var )
  2557. int var[];
  2558. {
  2559.     int sw, cx, cy, temp;
  2560.     int mp[4];
  2561.  
  2562. zoom1:    MOS_disp(1);
  2563.     mouse( mp, 0, 0, 0 );
  2564.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  2565.     MOS_disp(0);
  2566.     if( sw > 1 )goto zoom2;
  2567.     var[0] = cx; var[1] = cy;
  2568.     mouse( mp, 0, 0, 4 );
  2569.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  2570.     if( sw > 1 )goto zoom1;
  2571.     if( cx == var[0] || cy == var[1] )return 0;
  2572.     var[2] = cx; var[3] = cy;
  2573. zoom2:    if( var[0] > var[2] ){
  2574.         temp = var[0]; var[0] = var[2]; var[2] = temp;
  2575.     }
  2576.     if( var[1] > var[3] ){
  2577.         temp = var[1]; var[1] = var[3]; var[3] = temp;
  2578.     }
  2579.     return 0;
  2580. }
  2581.  
  2582. zooming( var, bbuf )
  2583. int var[];
  2584. char *bbuf;
  2585. {
  2586.     int ax1, ay1, ax2, ay2, ax, ay, axd, ayd;
  2587.     int bx1, by1, bx2, by2, x, y, vadd, xds, yds;
  2588.     int data1, data2, data3, data4;
  2589.     char *dadd;
  2590.     int temp, i, j, b, r, g, s, p[3][4];
  2591.  
  2592. /* 座標初期設定 */
  2593.     if( var[0] < var[2] ){ ax1 = var[0]; ax2 = var[2]; }
  2594.     else             { ax1 = var[2]; ax2 = var[0]; }
  2595.     if( var[1] < var[3] ){ ay1 = var[1]; ay2 = var[3]; }
  2596.     else             { ay1 = var[3]; ay2 = var[1]; }
  2597.     if( var[4] < var[6] ){ bx1 = var[4]; bx2 = var[6]; }
  2598.     else             { bx1 = var[6]; bx2 = var[4]; }
  2599.     if( var[5] < var[7] ){ by1 = var[5]; by2 = var[7]; }
  2600.     else             { by1 = var[7]; by2 = var[5]; }
  2601.     if( ( bx1 == bx2 ) || ( by1 == by2 ) ){        /* 座標error */
  2602.         return 0;
  2603.     }
  2604.     s = var[8];                /* sharp rate */
  2605.     ax1 = ax1 << 16; ay1 = ay1 << 16;
  2606.     ax2 = ax2 << 16; ay2 = ay2 << 16;    /* 仮想座標 16bit.16bit */
  2607.     axd = ( ax2 - ax1 )/( bx2 - bx1 );    /* ovre sampling rate */
  2608.     ayd = ( ay2 - ay1 )/( by2 - by1 );
  2609.     ay = ay1;                /* ay: 可変 samplin y座標 */
  2610. zoom1:    for( y=by1 ; y<=by2 ; y++ ){    /* y-loop */
  2611.         ax = ax1;            /* ax: 可変 sampling x座標 */
  2612.         dadd = bbuf + (ay >> 16)*1024 + (ax >> 16)*2;    /*data add*/
  2613.         vadd = y*1024 + bx1*2;                /*v-ram addr*/
  2614.         yds = ( ay >> 8 ) & 0xff;    /* over smp. Y-少数部分 */
  2615.         for( i=0 ; i<3 ; i++ ){        /* x-loop 初期data set */
  2616.            if( ay > 0xffff ){
  2617.             for( j=0 ; j<4 ; j++ ){        /* y座標 > 0 */
  2618.                 data1 = WORD( dadd+(j-1)*2-1024 );
  2619.                 data1 = ( ( data1 >> (i*5) ) & 0x1f ) << 3;
  2620.                 data2 = WORD( dadd+(j-1)*2 );
  2621.                 data2 = ( ( data2 >> (i*5) ) & 0x1f ) << 3;
  2622.                 data3 = WORD( dadd+(j-1)*2+1024 );
  2623.                 data3 = ( ( data3 >> (i*5) ) & 0x1f ) << 3;
  2624.                 data4 = WORD( dadd+(j-1)*2+2048 );
  2625.                 data4 = ( ( data4 >> (i*5) ) & 0x1f ) << 3;
  2626.                 p[i][j] = smp17(yds,data1,data2,data3,data4,s);
  2627.             }
  2628.            }
  2629.            else {
  2630.             for( j=0 ; j<4 ; j++ ){        /* y座標 = 0 */
  2631.                 data1 = WORD( dadd+(j-1)*2 );
  2632.                 data1 = ( ( data1 >> (i*5) ) & 0x1f ) << 3;
  2633.                 data2 = data1;
  2634.                 data3 = WORD( dadd+(j-1)*2+1024 );
  2635.                 data3 = ( ( data3 >> (i*5) ) & 0x1f ) << 3;
  2636.                 data4 = WORD( dadd+(j-1)*2+2048 );
  2637.                 data4 = ( ( data4 >> (i*5) ) & 0x1f ) << 3;
  2638.                 p[i][j] = smp17(yds,data1,data2,data3,data4,s);
  2639.             }
  2640.            }
  2641.            if( ax < 0x10000 )p[0][j] = p[1][j];    /* x座標 = 0 */
  2642.         }
  2643.         for( x=bx1 ; x<=bx2 ; x++ ){    /* x-loop */
  2644.             if( x > 511 )break;    /* はみ出した場合次のy-loop */
  2645.             xds = ( ax >> 8 ) & 0xff;  /* over smp. X-少数部分 */
  2646.             b = smp17( xds, p[0][0], p[0][1], p[0][2], p[0][3],s );
  2647.             r = smp17( xds, p[1][0], p[1][1], p[1][2], p[1][3],s );
  2648.             g = smp17( xds, p[2][0], p[2][1], p[2][2], p[2][3],s );
  2649.             if( b < 0 )b=0;
  2650.             if( b > 255 )b=255;
  2651.             if( r < 0 )r=0;
  2652.             if( r > 255 )r=255;
  2653.             if( g < 0 )g=0;
  2654.             if( g > 255 )g=255;
  2655.             pokew( vadd, 0x10c, (b>>3)+((r<<2)&0x3e0)+((g<<7)&0x7c00) );
  2656.             vadd = vadd + 2;        /* inc data */
  2657.             temp = ax >> 16; ax = ax + axd;
  2658.             while( temp < ( ax >> 16 ) ){    /* 整数部分変化有り */
  2659.                 dadd = dadd + 2;
  2660.                 for( i=0 ; i<3 ; i++ ){
  2661.                    p[i][0] = p[i][1];
  2662.                    p[i][1] = p[i][2];
  2663.                    p[i][2] = p[i][3];
  2664.                    if( ay > 0xffff ){    /* y > 0 */
  2665.                     data1 = WORD( dadd+4-1024 );
  2666.                     data1 = ((data1 >> (i*5)) & 0x1f) << 3;
  2667.                     data2 = WORD( dadd+4 );
  2668.                     data2 = ((data2 >> (i*5)) & 0x1f) << 3;
  2669.                     data3 = WORD( dadd+4+1024 );
  2670.                     data3 = ((data3 >> (i*5)) & 0x1f) << 3;
  2671.                     data4 = WORD( dadd+4+2048 );
  2672.                     data4 = ((data4 >> (i*5)) & 0x1f) << 3;
  2673.                     p[i][3] = smp17(yds,data1,data2,data3,data4,s);
  2674.                    }
  2675.                    else {        /* y = 0 */
  2676.                     data1 = WORD( dadd+4 );
  2677.                     data1 = ((data1 >> (i*5)) & 0x1f) << 3;
  2678.                     data2 = data1;
  2679.                     data3 = WORD( dadd+4+1024 );
  2680.                     data3 = ((data3 >> (i*5)) & 0x1f) << 3;
  2681.                     data4 = WORD( dadd+4+2048 );
  2682.                     data4 = ((data4 >> (i*5)) & 0x1f) << 3;
  2683.                     p[i][3] = smp17(yds,data1,data2,data3,data4,s);
  2684.                    }
  2685.                 }
  2686.                 temp++;
  2687.             }
  2688.         }
  2689.         ay = ay + ayd;
  2690.     }
  2691.     return 0;
  2692. }
  2693.  
  2694. line_set( x1, y1, x2, y2, ework )
  2695. int x1, y1, x2, y2;
  2696. char *ework;
  2697. {
  2698.     char para[32];
  2699.  
  2700.     EGB_color( ework, 0, C_COLOR );
  2701.     EGB_writeMode( ework, 4 );        /* XOR */
  2702.     EGB_paintMode( ework, 0x22 );
  2703.     WORD( para+0 ) = 2;
  2704.     WORD( para+2 ) = x1;
  2705.     WORD( para+4 ) = y1;
  2706.     WORD( para+6 ) = x2;
  2707.     WORD( para+8 ) = y2;
  2708.     EGB_unConnect( ework, para );
  2709.     return 0;
  2710. }
  2711.  
  2712.